位运算
位操作是程序设计中对位数组或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。计算机中的数据在内存中都是以二进制形式进行存储的,用位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高。
与(&)
只有参与运算的两个位都为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
解释:
- a=a^b
- b=abb b^b为0 故结果为a
- 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次方。