位运算
按位逻辑运算
取反 ~
一元运算符~把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 | mask
flags的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!");
移位运算符
左移 <<
左移运算符(<<)将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末端位的值丢失,用0填充空出的位置。
(10001010) << 2
(00101000)
该操作产生了一个新的位值,但是不改变其运算对象。例如,假设stonk为1,那么stonk<<2为4,但是stonk本身不变,仍为1。可以使用左移赋值运算符(<<=)来更改变量的值。该运算符将变量中的位向左移动其右侧运算对象给定值的位数。如下例:
int stonk = 1;
int onkoo;
onkoo = stonk << 2; /* 把4赋给onkoo */
stonk <<= 2; /* 把stonk的值改为4 */
右移 >>
右移运算符(>>)将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。左侧运算对象移出右末端位的值丢。
- 无符号 用0补位
(10001010) >> 2
(00100010)
- 有符号 结果取决于机器 用0或者符号位的副本填充
(10001010) >> 2 // 表达式,有符号值
(00100010) // 在某些系统中的结果值
(10001010) >> 2 // 表达式,有符号值
(11100010) // 在另一些系统上的结果值
运用
- 移位运算符针对2的幂提供快速有效的乘法和除法
number << n // number 乘以2的n次幂
number >> n
- 移位运算符针对2的幂提供快速有效的乘法和除法
假设用一个unsigned long类型的值表示颜色值,低阶位字节存储红色的强度,下一个字节存储绿色的强度,第3个字节存储蓝色的强度。随后你希望把每种颜色的强度分别存储在3个不同的unsigned char类型的变量中
#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;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)