找回密码
 立即注册
首页 资源区 代码 位运算

位运算

周冰心 3 天前
按位逻辑运算

取反 ~

一元运算符~把1变为0,把0变为1
  1. ~(10011010)
  2. 01100101
  3. val = ~val
复制代码
按位与 &

二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1
  1. (10010011) & (00111101)
  2. (00010001)
  3. val &= 0377;
复制代码
按位或 |

二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1
  1. (10010011) | (00111101)
  2. (10111111)
  3. val |= 0377
复制代码
按位异或 ^

二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1
  1. (10010011) ^ (00111101)
  2. (10101110)
  3. val ^= 0377
复制代码
掩码

mask = 2 (0000 0010)
  1. flag = flag & mask
复制代码
那么flag 的位都会置位为0 除了掩码为1的第二位
可以这样类比:把掩码中的0看作不透明,1看作透明 用掩码中的0将flag给掩盖起来了
打开位
  1. flag = flag | mask
复制代码
flags的1号位设置为1,且其他位不变
根据MASK中为1的位,把flags中对应的位设置为1,其他位不变
关闭位
  1. flag = flag & ~mask;
复制代码
根据MASK中为1的位,把flags中对应的位设置为0,其他位不变
切换位
  1. flag = flag ^ mask
复制代码
根据MASK中为1的位,把flags中对应的位取反,其他位不变
检查位的值

flags中1号位是否被设置为1
  1. if ((flags & MASK) == MASK)
  2.         puts("Wow!");
复制代码
移位运算符

左移 </h3p左移运算符()将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末端位的值丢失,用0填充空出的位置。/p
  1. (10001010) << 2
  2. (00101000)
复制代码
p该操作产生了一个新的位值,但是不改变其运算对象。例如,假设stonk为1,那么stonk2为4,但是stonk本身不变,仍为1。可以使用左移赋值运算符(=)来更改变量的值。该运算符将变量中的位向左移动其右侧运算对象给定值的位数。如下例:/p
  1. int stonk = 1;
  2. int onkoo;
  3. onkoo = stonk << 2; /* 把4赋给onkoo */
  4. stonk <<= 2; /* 把stonk的值改为4 */
复制代码
h3 id="右移-"右移 /h3p右移运算符()将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。左侧运算对象移出右末端位的值丢。/pulli无符号 用0补位/li/ul
  1. (10001010) >> 2
  2. (00100010)
复制代码
ulli有符号 结果取决于机器 用0或者符号位的副本填充/li/ul
  1. (10001010) >> 2 // 表达式,有符号值
  2. (00100010) // 在某些系统中的结果值
  3. (10001010) >> 2 // 表达式,有符号值
  4. (11100010) // 在另一些系统上的结果值
复制代码
h3 id="运用"运用/h3ulli移位运算符针对2的幂提供快速有效的乘法和除法/li/ul
  1. number << n  // number 乘以2的n次幂
  2. number >> n
复制代码
ulli移位运算符针对2的幂提供快速有效的乘法和除法br假设用一个unsigned long类型的值表示颜色值,低阶位字节存储红色的强度,下一个字节存储绿色的强度,第3个字节存储蓝色的强度。随后你希望把每种颜色的强度分别存储在3个不同的unsigned char类型的变量中/li/ul
  1. #define BYTE_MASK 0xff
  2. unsigned long color = 0x002a162f;
  3. unsigned char blue, green, red;
  4. red = color & BYTE_MASK;
  5. green = (color >> 8) & BYTE_MASK;
  6. blue = (color >> 16) & BYTE_MASK;
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册