目录

  • 1 计算机概述
    • 1.1 计算机简介
    • 1.2 计算机系统
    • 1.3 数值在计算机中的表示
  • 2 C语言概述
    • 2.1 C语言发展及特点
    • 2.2 C语言程序的运行步骤和开发环境
    • 2.3 简单的C语言程序
  • 3 C语言基础
    • 3.1 变量、常量及数据类型
    • 3.2 运算符和表达式
    • 3.3 输入、输出
  • 4 选择结构
    • 4.1 计算机编程和算法
    • 4.2 if语句
    • 4.3 if嵌套和if多分支
    • 4.4 switch语句
  • 5 循环结构
    • 5.1 while语句和do...while语句
    • 5.2 for语句
    • 5.3 break语句和continue语句
    • 5.4 goto语句构成的循环
    • 5.5 嵌套循环结构
    • 5.6 程序设计举例
  • 6 函数
    • 6.1 函数的定义与调用
    • 6.2 函数的嵌套调用和递归调用
    • 6.3 作用域和生命周期
    • 6.4 章节小结与测试
  • 7 数组
    • 7.1 一维数组及应用
    • 7.2 二维数组及应用
    • 7.3 字符数组
    • 7.4 数组作为函数参数
    • 7.5 章节小结与测试
  • 8 指针
    • 8.1 指针变量
    • 8.2 指针与数组
    • 8.3 指针的多种形态
  • 9 字符串
    • 9.1 字符串概念及输入输出
    • 9.2 字符串函数
    • 9.3 指针与字符串
    • 9.4 章节小结与测试
  • 10 编译预处理
    • 10.1 宏定义
    • 10.2 文件包含
    • 10.3 条件编译
  • 11 结构体、共用体和用户定义类型
    • 11.1 结构体类型变量
    • 11.2 结构体类型数组与指针
    • 11.3 结构体与函数
    • 11.4 用指针处理链表
    • 11.5 共用体
  • 12 位运算
    • 12.1 位运算的概念和运算规则
  • 13 文件
    • 13.1 C文件概述
    • 13.2 文件的打开与关闭
    • 13.3 文件读写
    • 13.4 位置指针的定位
位运算的概念和运算规则

学习目标:

    掌握各种位运算的概念

    掌握各种位运算的运算规则

重点:

    掌握按位与运算操作。

    掌握按位或运算操作。

    掌握按位异或运算操作。

    掌握按位取反操作。

    掌握按位左移操作。

    掌握按位右移操作。

难点:

    理解左移一位,乘以2

    理解右移一位,除以2

 

位运算符允许对一个字节或更大的数据单位中独立的位做处理:可以清除、设定,或者倒置任何位或多个位。也可以将一个整数的位模式(bit pattern)向右或向左移动。

 

一、按位与操作

  1. 按位与是双目运算符,参加运算的两个操作数按二进制位进行“与”运算。

  2. 按位与符号:&

注意点:按位与符号(&)和逻辑运算符的与(&&)要相区分开。

例如:15&3的结果为3。

   00001111   /*十进制15*/

 &00000011  /*十进制3*/

   00000011  /*十进制3*/

按位与运算可以作为一种对字节中某一个或几个二进制位清0的手段。在上例的运算中,15只保留了最低2位不变,其余位均被清0.

 

二、按位或操作

  1. 按位或是双目运算符,参加运算的两个操作数按二进制位进行“或”运算。

  2. 按位或符号:|

注意点:按位或符号(|)和逻辑运算符的或(||)要相区分开。

例如:15|32的结果为47。

    00001111   /*十进制15*/

    |00100000   /*十进制32*/

    00101111   /*十进制47*/

按位与运算可以作为一种对字节中某一个或几个二进制位置1的手段。在上例的运算中,将存放15的字节中的第6位置1,其余位保持不变。

 

三、按位异或操作

  1. 按位异或也是双目运算符,参加运算的两个操作数按二进制位进行“异或”运算。

  2. 按位异或符号:^。

便于记忆:相同值为0,相异值为1。

例如:15^3的结果为12。

   00001111  /*十进制15*/

 ^00000011  /*十进制3*/

   00001100  /*十进制12*/

利用按位异或可以很容易判断两个数的对应二进制位是相同还是相异,结果为0表示相同,结果为1表示相异。

 

四、按位取反操作

  1. 定义:按位取反是对操作数的各位二进制值取反,即0变1,1变0.

按位取反符号:~

  1. 注意点:按位取反符号(~)和逻辑运算符的取反(!)要相区分开。

例如:~5的运算过程如下,结果为-6(最高位为1)。

5=(00000101)B

 ~00000101   /*十进制5*/

  11111010   /*十进制-6(负数用补码表示,取反加一)*/

按位取反是单目运算符,其优先级比其他双目运算符,比如算术运算符、关系运算符以及其他位运算符高。


五、左位移操作

  1. 将第一操作数的每一位向左平移第二操作数指定的位数,右边空位补0,左边移出去的位丢弃。

  2. 按位左移符号:<<。

例如:15及其左移1位,2位,3位的二进制补码如下表。

                                       

 

表达式

 
 

最低字节内容

 
 

运算结果

 
 

实际意义

 
 

15

 
 

00001111

 
 

15

 
 

二进制码

 
 

15<<1

 
 

00011110

 
 

30

 
 

左移一位相当于乘以2

 
 

15<<2

 
 

00111100

 
 

60

 
 

左移两位相当于乘以2^2

 
 

15<<3

 
 

01111000

 
 

120

 
 

左移三位相当于乘以2^3

 

可见,利用左移位可以快速地实现整数的乘法运算,每左移一位相当于乘以2,左移n位相当于乘以2^n,非常有利于算法的硬件实现。

 

六、右移位操作

  1. 将第一操作数的每一位向右平移第二操作数指定的位数,右边移出去的为丢弃。当第一操作数为有符号数时,左边空位符号上的值,这种移位称为算术移位;当第一操作数为无符号数时,左边空位补0,这种移位称为逻辑移位。

  2. 按位右移符号:>>。

例如:15和-15分别进行右移1位、2位、3位的二进制补码如下表。

                                                                       

 

表达式

 
 

最低字节内容

 
 

运算结果

 
 

实际意义

 
 

15

 
 

00001111

 
 

15

 
 

补码表示原值

 
 

15>>1

 
 

00000111

 
 

7

 
 

右移1位相当于除以2

 
 

15>>2

 
 

00000011

 
 

3

 
 

右移2位相当于除以2^2

 
 

15>>3

 
 

00000001

 
 

1

 
 

右移3位相当于除以2^3

 
 

-15

 
 

11110001

 
 

-15

 
 

补码表示原值

 
 

-15>>1

 
 

11111000

 
 

-8

 
 

右移1位相当于除以2

 
 

-15>>2

 
 

11111100

 
 

-4

 
 

右移2位相当于除以2^2

 
 

-15>>3

 
 

11111110

 
 

-2

 
 

右移3位相当于除以2^3

 

可见,利用右移位可以快速地实现整数的除法运算,每右移一位相当于除以2,右移n位就相当于除以2^n,非常有利于算法的硬件实现。