位运算(与、或、异或)

位运算

位操作是程序设计中对位数组或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。计算机中的数据在内存中都是以二进制形式进行存储的,用位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高。

与(&)

只有参与运算的两个位都为1时结果才为1,否则为0

  • 1&1=1
  • 1&0=0
  • 0&0=0

例1:

 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001  (1 在内存中的存储)

例2:
判断数值a是奇数还是偶数?

//思路:只要根据数的最后一位是0还是1来决定即可,为0就是偶数,为1就是奇数
if((a&1)==0){
    Debug.Log("偶数");
}else{
    Debug.Log("奇数");
}

或(|)

参与运算的两个位有一个为1时结果就为1,否则为0

  • 1|1=1
  • 1|0=1
  • 0|0=0

例:

   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
 | 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101  (13 在内存中的存储)

取反(~)

对参与运算的位进行取反,0变为1 1变为0

  • ~1=0
  • ~0=1

例:

~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)
-----------------------------------------------------------------------------------
 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000  (8 在内存中的存储)

异或(^)

对参与运算的位进行比较,相同取0,不同取1

  • 1^1=0
  • 1^0=1
  • 0^0=0

例:

   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
 ^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100  (12 在内存中的存储)

例2:
两数交换而不创建第三个临时变量?

int a =10;
int b =35;
a=a^b;
b=a^b;
a=a^b;
Debug.Log($"a={a}");
Debug.Log($"b={b}");

输出结果为:
a=35
b=10

解释:

  1. a=a^b
  2. b=abb b^b为0 故结果为a
  3. a=a^b= aba a^a为0 故结果为b

移位

左移(<<)

把数据的各个二进制位全部左移若干位,高位丢弃,低位补0

例:

3<<2
1. 3的二进制数为:0000 0000 0000 0000 0000 0000 0000 0011
2. 把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。
3. 得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12。

数学意义:

  • 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

右移(>>)

把数据的各个二进制位全部右移若干位,低位丢弃,高位补0或,1,如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。

例:

11 >> 2
1. 11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011
2. 把低位的最后两个数字移出,因为高位是0,所以在高位补0
3. 得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。

数学意义:

  • 右移一位相当于除2,右移n位相当于除以2的n次方。

猜你喜欢

转载自blog.csdn.net/weixin_42498461/article/details/131069988
今日推荐