C 语言常用位操作
C 语言提供 按位逻辑运算 和 移位运算 两类运算符。
C 按位逻辑运算
按位逻辑运算符有4个, 用于整形数据(包含 char 型数据)。
按位操作针对数据的某个数位进行, 不影响左右两边其他数位。
按位运算符
按位逻辑运算:
[~]按位取反; 一元运算符; 按照二进制数位, 0 变 1, 1 变 0;[&]按位取与; 二元运算符; 逐数位比较两个运算对象并生成新值, 对于新值的每个数位, 只有当两个运算对象该数位上都是 1 时, 新值该数位上才是 1 ;[|]按位取或; 二元运算符; 逐数位比较两个运算对象并生成新值, 对于新值的每个数位, 只要两个运算对象该数位上存在 1 , 新值该数位上就是 1 ;[^]按位异或; 二元运算符; 逐数位比较两个运算对象并生成新值, 对于新值的每个数位, 只有两个运算对象该数位上的值一个为 1 另一个为 0 时, 新值该数位才为 1 。
按位运算常用用法
C 语言中按位运算常用以下五种用法:
- 使用掩码;
- 打开位;
- 关闭位;
- 切换位;
- 检查位数值。
使用掩码
掩码 (mask) 是指一些设置为开 (1) 或关 (0) 的位组合。
对于一个变量 flags 和一个掩码 mask, 若将二者取 & 运算, 则将按照掩码 mask 指示的位 (即数值为1的位) 去 "读取" flags 对应位的数值。
通常把 flags & mask 运算称为使用掩码 mask。
可以认为掩码中 0 代表不透明,1 代表透明;
flags & mask 相当于将掩码mask 掩盖 到 flags 上, 然后我们只能透过掩码透明的位看到下面 flags 的位数值。
打开位
打开位是指将变量 flags 某一数位的值设置为 1 并保持其他数位不变。
为了完成这一操作, 可以在掩码中用 1 标识出待打开位 (待开位设 1 其它位设 0 ), 然后用 flags 跟掩码进行按位或(|)。
注意: 无论打开位操作前 flags 在该数位上的值是否为 1 , 打开位操作后该位数值均为 1 。
关闭位
关闭位是指将变量 flags 某一数位的值设置为 0 并保持其他数位不变。
为了完成这一操作, 可以在掩码中用 1 标识出待关闭位 (待关闭位设 1 其它位设0 ), 然后用 flags 跟掩码进行按位与非(&~)。
注意: 无论关闭位操作前 flags 在该数位上的值是否为 0 , 关闭位操作后该位数值均为 0 ;用掩码标识出全部数位 (所有数位置 1 ) 后, 关闭位可清空 flags 所有位。
切换位
切换位是指将变量 flags 某一数位从 0 变 1 或从 1 变 0 并保持其他数位不变。
为了完成这一操作, 可以在掩码中用 1 标识出待切换位 (待切换位设 1 其他位设 0 ), 然后用 flags 跟掩码进行按位异或(^)。
检查位数值
检查位数值是指确认变量 flags 某一位的数值是 0 还是 1。
由于我们只想确认某一数位的值, 而不是变量整体表示的数值, 因此不能使用 == 直接进行判断。
我们可以先 使用掩码 (&) 取出待检查数位的值, 再将该数位的值与掩码本身或 0 比较来判断该数位的值 是否是 1 或 是否是 0。
if ((flags & mask) == mask) { printf("That bit is 1."); }
if ((flags & mask) == 0) { printf("That bit is 0."); }
注意: 需要每次只判断一个数位, 然后遍历检验所有待验数位。
C 移位运算
移位运算符
移位运算:
[<<]左移位; 将 左值 每一位向左移动 右值 指定的位数; 左值移出左末端的值丢失, 右侧因为左移空出来的数位补 0 。[>>]右移位; 将 左值 每一位向右移动 右值 指定的位数; 左值移出右末端的值丢失; 对于无符号类型, 左值 左侧因为右移空出来的数位将被补 0 ; 对于有符号类型, 左值 左侧因为右移空出来的数位补 0 还是补 1 取决于机器类型。

浙公网安备 33010602011771号