位运算
按位逻辑运算取反 ~
一元运算符~把1变为0,把0变为1
~(10011010)
01100101
val = ~val按位与 &
二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1
(10010011) & (00111101)
(00010001)
val &= 0377;按位或 |
二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1
(10010011) | (00111101)
(10111111)
val |= 0377按位异或 ^
二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1
(10010011) ^ (00111101)
(10101110)
val ^= 0377掩码
mask = 2 (0000 0010)
flag = flag & mask那么flag 的位都会置位为0 除了掩码为1的第二位
可以这样类比:把掩码中的0看作不透明,1看作透明 用掩码中的0将flag给掩盖起来了
打开位
flag = flag | maskflags的1号位设置为1,且其他位不变
根据MASK中为1的位,把flags中对应的位设置为1,其他位不变
关闭位
flag = flag & ~mask;根据MASK中为1的位,把flags中对应的位设置为0,其他位不变
切换位
flag = flag ^ mask根据MASK中为1的位,把flags中对应的位取反,其他位不变
检查位的值
flags中1号位是否被设置为1
if ((flags & MASK) == MASK)
puts("Wow!");移位运算符
左移 </h3p左移运算符()将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末端位的值丢失,用0填充空出的位置。/p(10001010) << 2
(00101000)p该操作产生了一个新的位值,但是不改变其运算对象。例如,假设stonk为1,那么stonk2为4,但是stonk本身不变,仍为1。可以使用左移赋值运算符(=)来更改变量的值。该运算符将变量中的位向左移动其右侧运算对象给定值的位数。如下例:/pint stonk = 1;
int onkoo;
onkoo = stonk << 2; /* 把4赋给onkoo */
stonk <<= 2; /* 把stonk的值改为4 */h3 id="右移-"右移 /h3p右移运算符()将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。左侧运算对象移出右末端位的值丢。/pulli无符号 用0补位/li/ul(10001010) >> 2
(00100010)ulli有符号 结果取决于机器 用0或者符号位的副本填充/li/ul(10001010) >> 2 // 表达式,有符号值
(00100010) // 在某些系统中的结果值
(10001010) >> 2 // 表达式,有符号值
(11100010) // 在另一些系统上的结果值h3 id="运用"运用/h3ulli移位运算符针对2的幂提供快速有效的乘法和除法/li/ulnumber << n// number 乘以2的n次幂
number >> nulli移位运算符针对2的幂提供快速有效的乘法和除法br假设用一个unsigned long类型的值表示颜色值,低阶位字节存储红色的强度,下一个字节存储绿色的强度,第3个字节存储蓝色的强度。随后你希望把每种颜色的强度分别存储在3个不同的unsigned char类型的变量中/li/ul#define BYTE_MASK 0xff
unsigned long color = 0x002a162f;
unsigned char blue, green, red;
red = color & BYTE_MASK;
green = (color >> 8) & BYTE_MASK;
blue = (color >> 16) & BYTE_MASK;
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]