学习目标:
掌握各种位运算的概念
掌握各种位运算的运算规则
重点:
掌握按位与运算操作。
掌握按位或运算操作。
掌握按位异或运算操作。
掌握按位取反操作。
掌握按位左移操作。
掌握按位右移操作。
难点:
理解左移一位,乘以2
理解右移一位,除以2
位运算符允许对一个字节或更大的数据单位中独立的位做处理:可以清除、设定,或者倒置任何位或多个位。也可以将一个整数的位模式(bit pattern)向右或向左移动。
一、按位与操作
按位与是双目运算符,参加运算的两个操作数按二进制位进行“与”运算。
按位与符号:&
注意点:按位与符号(&)和逻辑运算符的与(&&)要相区分开。
例如:15&3的结果为3。
00001111 /*十进制15*/
&00000011 /*十进制3*/
00000011 /*十进制3*/
按位与运算可以作为一种对字节中某一个或几个二进制位清0的手段。在上例的运算中,15只保留了最低2位不变,其余位均被清0.
二、按位或操作
按位或是双目运算符,参加运算的两个操作数按二进制位进行“或”运算。
按位或符号:|
注意点:按位或符号(|)和逻辑运算符的或(||)要相区分开。
例如:15|32的结果为47。
00001111 /*十进制15*/
|00100000 /*十进制32*/
00101111 /*十进制47*/
按位与运算可以作为一种对字节中某一个或几个二进制位置1的手段。在上例的运算中,将存放15的字节中的第6位置1,其余位保持不变。
三、按位异或操作
按位异或也是双目运算符,参加运算的两个操作数按二进制位进行“异或”运算。
按位异或符号:^。
便于记忆:相同值为0,相异值为1。
例如:15^3的结果为12。
00001111 /*十进制15*/
^00000011 /*十进制3*/
00001100 /*十进制12*/
利用按位异或可以很容易判断两个数的对应二进制位是相同还是相异,结果为0表示相同,结果为1表示相异。
四、按位取反操作
定义:按位取反是对操作数的各位二进制值取反,即0变1,1变0.
按位取反符号:~
注意点:按位取反符号(~)和逻辑运算符的取反(!)要相区分开。
例如:~5的运算过程如下,结果为-6(最高位为1)。
5=(00000101)B
~00000101 /*十进制5*/
11111010 /*十进制-6(负数用补码表示,取反加一)*/
按位取反是单目运算符,其优先级比其他双目运算符,比如算术运算符、关系运算符以及其他位运算符高。
五、左位移操作
将第一操作数的每一位向左平移第二操作数指定的位数,右边空位补0,左边移出去的位丢弃。
按位左移符号:<<。
例如: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,非常有利于算法的硬件实现。
六、右移位操作
将第一操作数的每一位向右平移第二操作数指定的位数,右边移出去的为丢弃。当第一操作数为有符号数时,左边空位符号上的值,这种移位称为算术移位;当第一操作数为无符号数时,左边空位补0,这种移位称为逻辑移位。
按位右移符号:>>。
例如: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,非常有利于算法的硬件实现。

