按位逻辑运算符
C语言提供了四种按位逻辑运算符
注:他们的操作数必须是整数。
1.按位取反(~)
~运算符把0变为1,把1变为0,如下例子所示:
~(0100 1001)=10110110,
这里需要注意的是
假设val的类型是unsigned char,已被赋值为2。在二进制中,0000 0010表示2。那么,~val的值是 1111 1101,即253。注意,该运算符不会改变val的值,但是可以这样用:val = ~val。 或者直接声明一个新的变量newval = ~val。
2.按位与(&)
&运算符通过逐位比较产生一个新值,如果把1看为真,0看为假,运算规则可以记为同真则真,一假则假。如下例子所示:
(1001 0011)&(0011 1101)=(0001 0001)
3.按位或(|)
|运算符通过逐位比较产生新值,如果把1看为真,0看为假,运算规则可以记为一真则真。如下例子所示:
(1001 0011)|(0011 1101)=(1011 1111)
4.按位异或(^)
^运算符通过逐位比较产生新值,如果两个运算对象中只有一个为1(但不是两个都为1),结果为1。如下例子所示:
(1001 0011)^(0011 1101)= (1010 1110)
c有一个按位异或和赋值运算结合的运算符:^=.
移位运算符
1.左移
表达式1 << 位数
将表达式1左移运算符右侧指定位数,移出左末端位的值丢,用0填充空出的位置。
2.右移
表达式1 >>位数
将表达式1右移运算符右侧指定位数,移出右末端的值丢掉,对于无符号类型,用0填充空出的位置;对于有符号类型,其结果取决于机器。空出的位置可用0填充,或者填充符号位原本的数字。如下例子所示:
(1000 1010)>>2 //表达式,有符号值
(0010 0010) //在某些系统中的值
(1000 1010)>>2 //表达式,有符号值
(1110 0010) //在另某一些系统中的值
下面是无符号值的例子:
(1000 1010)>>2
(0010 0010)
3.位移运算符用法
移位运算符针对2的幂提供快速的乘法和除法
number<<2 | number乘以2的n次幂 |
---|---|
number>>2 | 如果number 为非负,则用number除以2的n次幂 |
例题(选自c primer plus)
假设用一个unsigned long 类型的值表示颜色值,低阶位字节储存红色的强度,下一个字节储存绿的的强度,第三个字节储存蓝色的强度。随后你希望把每种颜色的强度分别储存在3个不同的unsigned char类型的变量中。那么,可以使用下面的语句:
#define BYTE_MASK 0xff
unsigned long color = 0x002a162f;
unsigned char bule, green, red;
red = color & BYTE_MASK 0xff;
green = (color >> 8) & BYTE_MASK 0xff;
blue = (color >> 16) & BYTE_MASK 0xff;