位运算是计算机底层最基础的操作,直接操作二进制位(0 和 1)。尽管现代编程语言提供了高级抽象,但理解位运算的本质能显著提升代码效率和解决特定问题的能力。本文将深入探讨位运算的核心原理、常见技巧及其实际应用场景。
所有位运算都基于二进制数的逐位操作。以下是六种基本操作:
与(AND) &
1010 & 1100 = 1000
或(OR) |
1010 | 1100 = 1110
异或(XOR) ^
1010 ^ 1100 = 0110
非(NOT) ~
~1010 = 0101
(假设 4 位)~x = -(x+1)
)。左移(SHL) <<
1010 << 2 = 101000
右移(SHR) >>
1010 >> 2 = 0010
(逻辑右移)判断奇偶性
csharpbool isOdd = (num & 1) == 1; // 末位为 1 则为奇数
交换两个数(无临时变量)
csharpa ^= b; // a = a ^ b
b ^= a; // b = b ^ (a ^ b) = a
a ^= b; // a = (a ^ b) ^ a = b
求绝对值(整数)
csharpint mask = num >> 31; // 负数得全1,正数得0
int abs = (num ^ mask) - mask; // 负数取反加1
检查第 k 位是否为 1
csharpbool isSet = (num & (1 << k)) != 0;
状态压缩
bitmask
表示开关状态:
csharpint state = 0;
state |= (1 << 3); // 打开第3位
state &= ~(1 << 3); // 关闭第3位
高效数学计算
a * 7 = a << 3 - a
(因 (7 = 8-1))。(n & (n-1)) == 0
(如 8 & 7 = 0
)。数据加密
csharpbyte encrypted = data ^ key;
byte decrypted = encrypted ^ key; // 还原
位图(Bitmap)
运算符优先级:位运算优先级低于算术运算,建议多用括号:
csharpint result = (a & b) << 2; // 避免歧义
位移边界
int << 32
未定义)。有符号数处理
>>
)保留符号位,逻辑右移(>>>
)补 0(C# 用 >>>
)。位运算将复杂问题转化为底层二进制操作,在算法优化、系统编程等领域至关重要。掌握其本质后,可灵活应用于性能敏感场景(如游戏引擎、嵌入式系统)。后续文章将探讨位运算在算法题中的实战技巧。
本文作者:Peter.Pan
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!