位运算符和位运算
1. 位(逻辑)运算符
1.1“与AND”运算符&
1.1.1 运算规则
参加运算的两个数据,按二进制位进行“与”运算,如果两个相应的位都为1,则该位的结果值为1,否则为0,即:
0 & 0 = 0,
0 & 1 = 0,
1 & 0 = 0,
1 & 1 = 1.
1.1.2 用途
(1) 清零
(2) 取特定位
(3) 保留特定位
1.2“或OR”运算符 |
1.2.1 运算规则
参加运算的两个数据,按二进制位进行“或”运算,如果两个相应的位都为0,则该位的结果值为0,否则为1,即:
0 | 0 = 0,
0 | 1 = 1,
1 | 0 = 1,
1 | 1 = 1。
1.2.2 用途
1.3“取反NOT”运算符~ (!)
1.3.1 运算规则
~是一个单目运算符,用来对一个二进制数按位取反,即将0变1,1变0。
1.3.2 用途
1.4“异或XOR”运算^
1.4.1 运算规则
两者相等为0,不等为1.
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1
1.4.2 用途
1.4.2.1 交换两个整数,可以不用第三个参数
如a =11, b = 9.以下是二进制运算过程:
a = a ^ b = 1011 ^ 1001 = 0010;
b = b ^ a = 1001 ^ 0010 = 1011;
a = a ^ b = 0010 ^ 1011 = 1001;
交换:a = 9, b = 13 (注:仅限于整数)
1.4.2.2 翻转特定位
如:将数100001的第2位和第3位翻转,可以与100110进行异或运算。
100001 ^ 000110 = 100111
1.4.2.3 清0(汇编语言)
XOR a, a
2. 位移运算符
用于移位运算
2.1 左移运算符 <<
2.1.1 运算规则
左移若干位,右补0,高位左移后溢出且舍弃。
注:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
2.1.2 用途
左移一位相当于乘以2
2.2 右移运算符 >>
2.2.1 运算规则
右移若干位,移到右端的低位被舍弃。
对无符号数,高位补0。
对有符号数,左边移入0(“逻辑右移”)或1(“算术右移”)。
2.2.2 用途
右移一位相当于除以2 |