其他分享
首页 > 其他分享> > 神奇的位操作

神奇的位操作

作者:互联网

文章目录

位操作用法总结

位操作总述

运算符含义说明
<<左移将操作数的各个位全部左移若干位,高位丢弃,低位补0
>>右移将操作数的各个位全部右移若干位,低位丢弃,高位补 0 或 1
&与运算有0出0,全1出1
|或运算有1出1,全0出1
~非运算(取反)空即是色,色即是空
^异或相异出1,相同出0

清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或

一 :<< 左移

  1. 语法规则 :
    左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0
  2. 用法1:
    如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方: << 相当于:*
int a, b;
b = a << 3;  // 相当于 b = a * 8
  1. 用法2:
    将 int 型变量a的第k位清 0
a &= ~(1 << k)
  1. 用法3:
    将 int 型变量a的第k位置1
a |= (1 << k)
  1. 用法4:
    将 int 型变量循环左移k次
a = (a << k) | (a >> (sizeof(int)-k))

二: >> 右移

  1. 语法规则:
    右移运算符 >> 用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1;如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。
  2. 用法1:
    如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方: >>相当于:/
int a, b;
b = a >> 3;// 相当于除以 b = a / 8
  1. 用法2:
    取 int 型变量a的第k位 (k=0,1,2……sizeof(int))
a >> k & 1
  1. 用法3:
    int 型变量a循环右移k次
a = a >> k | a << (sizeof(int)-k)

三: & 与运算

  1. 语法规则:
    一个比特(Bit)位只有 0 和 1 两个取值,只有参与 & 运算的两个位都为 1 时,结果才为 1,否则为 0
  2. 用法1:
    检查整数是否为 2 的倍数
isEven = (i & 1) == 0; // 等价于: (i % 2) == 0;
  1. 用法2:
    取余数,如果除数为 2 的倍数,& 可相当于:%
num & (2^n - 1) // 等价于 :num % 2^n 
  1. 用法3:
    判断 int 型变量是 奇数 还是 偶数
 if( a & 1 == 0 ) // 偶数
 if( a & 1 == 1 ) // 奇数

四: | 或运算

  1. 语法规则:
    参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0
  2. 用法1:
    将 a 的第 k 位置 1
a = a | (1 << k)

五: ~ 非运算

  1. 语法规则:
    又叫取反运算符,~ 为单目运算符,右结合性,作用是对参与运算的二进制位取反,0 变成 1,1 变成 0
  2. 用法1:
    求 x 的相反数 y
y = ~x + 1;

六: ^ 异或

  1. 语法规则:
    参与^运算两个二进制位不同时,结果为 1,相同时结果为 0
  2. 用法1:
    交换两个数值
a = a^b;
b = a^b;
a = a^b;
  1. 用法2:
x = a ^ b ^ x;
// 等价于 :
if (x == a) {
	x = b;
}else{
	x = a;
} 

感谢阅读,如有错误,敬请见谅!!!


标签:右移,位操作,运算,int,用法,运算符,神奇
来源: https://blog.csdn.net/weixin_44289254/article/details/120883360