位运算是对整数在内存中的二进制位进行操作的方法。在计算机科学中,位运算是一种基础且重要的运算方式。下面是一些基本的位运算规则:
-
按位与(AND):符号为
&
。对于每一位,只有两个操作数相应的位都为1时,结果位才为1,否则为0。 -
按位或(OR):符号为
|
。对于每一位,只要两个操作数相应的位中有一个为1,结果位就为1。 -
按位异或(XOR):符号为
^
。对于每一位,只有两个操作数相应的位不同,结果位才为1,如果相同则为0。 -
按位取反(NOT):符号为
~
。对于操作数的每一位,1变成0,0变成1。 -
左移(Left Shift):符号为
<<
。将一个数的所有位向左移动指定的位数,右边空出的位用0填充。 -
右移(Right Shift):符号为
>>
。将一个数的所有位向右移动指定的位数。对于无符号数,左边空出的位用0填充;对于有符号数,某些系统用0填充(逻辑右移),而另一些则用符号位填充(算术右移)。
我们在做位运算时被操作的数可以是任何无符号的整数类型,但建议在所有的地方使用相同的类型,这里假定为以下数据类型:
using Uint = unsigned long;
- 设置位(Setting a bit)
将数字的第n位设置为1
inline Uint bit_set(Uint number, Uint n) {
return number | ((Uint)1 << n);
}
- 清除位(Clearing a bit)
将数字的第n位设置为0
inline Uint bit_clear(Uint number, Uint n) {
return number & ~((Uint)1 << n);
}
- 翻转位(Toggling a bit)
翻转数字的第n位
inline Uint bit_toggle(Uint number, Uint n) {
return number ^ ((Uint)1 << n);
}
- 检查位(Checking a bit)
判断数字的第n位是否为1
inline bool bit_check(Uint number, Uint n) {
return (number >> n) & (Uint)1;
}
- 将第n位更改为x(Changing the nth bit to x)
x为true时,类似于bit_set操作;
x为false时,类似于bit_clear操作;
inline Uint bit_set_to(Uint number, Uint n, bool x) {
return (number & ~((Uint)1 << n)) | ((Uint)x << n);
}