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 取决于机器类型。
posted @ 2021-11-28 16:27  火山菌  阅读(643)  评论(0)    收藏  举报