问题来源:刷LeetCode136,看到用“异或”运算来找出只出现一次的数,发现位运算学的不是很好,故来复习。
介绍
在 C# 中,位运算符用于直接操作二进制位(bit),通常用于底层编程或优化操作。
运算符 | 意义 | 例子(a、b均为整数变量) |
---|---|---|
~ | 非运算,按位取反 | ~a |
& | 与运算,全1为1,有0为0(看作乘法) | a & b |
| | 或运算,有1为1,全0为0(看作加法) | a | b |
^ | 异或运算,不同为1,相同为0 | a ^ b |
<< | 左移运算 | a << 1 |
>> | 右移运算 | a >> 2 |
1.非运算(~)
暂未发现
2.与运算(&)
a.判断一个数是否为2的幂 n & (n - 1)== 0
- 如果n为2的幂,n的二进制为100…(只有二进制的第一位为1),那么n - 1的二进制为0111…(只有二进制的第一位不为1),根据&的性质n & (n - 1 ) = 0则n为2的幂。
-
n & (n - 1)会把n中最后一个1变为0,从而可以判断二进制中1的个数。
public int HammingWeight(int n) {
//解法1:
int count = 0;
// while( n != 0)
// {
// if(n % 2 == 1) count++;
// n /= 2;
// }
//解法2:n & (n - 1)会把n中最后一个1变为0
while(n > 0)
{
n &= (n -1);
count++;
}
return count;
}
3.或运算(|)
暂未发现
4.异或运算(^)
a.找数组中只出现一次的数字,其他数字都为2个出现
根据异或的性质可以推出
1.n ^ n = 0
2.0 ^ n = n
所以可以用过对数组中的数字进行异或操作,找出只出现了一次的数字。
5.左移运算(>>)和右移运算(<<)
a.快速乘除2的幂
int number = 5;
int multiplied = number << 3; // 相当于 5 * 2^3 = 40
int divided = multiplied >> 2; // 相当于 40 / 2^2 = 10
如有其他的用法欢迎补充!