Bit manipulation
将二进制数某一位置0,置1,取反
- 用位运算可以解决我们的问题,所以下面部分的代码就是一些位运算的简单应用
- 函数实现
1. 将不同进制数转为二进制(非必须) - 我们只是为了显示结果
- 模拟人的计算过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48static void showBinary(int d)
{
using std::cout;
using std::endl;
using std::array;
// 存储具体对应的位的值 0 / 1
array<int, 32> num;
num.fill(0);
int flag = 1; // 当前转换的Bit位
for (int i = 31; i >= 0; i--)
{
if (d & flag)
{
num[i] = 1;
}
else
{
num[i] = 0;
}
flag = flag << 1;
}
// 查找第一个不是零的数
int index = 0;
// 此过程可以省略 做了个显示上的优化
for (auto i = 0; i < num.size(); i++)
{
if (num[i] != 0)
{
i == 0 ? index = i : index = i - 1;
break;
}
}
// 输出转换结果
for (auto i = index; i < num.size(); i++)
{
cout << num[i];
}
cout << endl;
}
某一位置为 0
&
运算的应用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/// 某一位设置为 0
/// d 你要修改的数
/// bits 你要修改的位置
template<typename T>
T setBit2Zero(T d, int bits)
{
BitManipulate::showBinary(static_cast<int>(d));
// 取反是一个只和取反位数以及之后所有位数相关的操作
// 二进制的位数从0开始计算 所以需要 bits - 1
// 1 << (bits(3) - 1) = 4 = 0100
// ~4 = 1011
// & 同为 1 则为 1 => 1011 & (任意数字) 第三位等于 0
d = d & (~(1 << (bits - 1)));
BitManipulate::showBinary(static_cast<int>(d));
return d;
}
某一位置为 1
|
运算的应用, 只要有一个是1 结果都是11
2
3
4
5
6
7
8
9
10
11
12
13
14/// 某一位设置为 1
/// d 你要修改的数
/// bits 你要修改的位置
template<typename T>
T setBit2One(T d, int bits)
{
BitManipulate::showBinary(static_cast<int>(d));
// d(16) = 10000 bits = 3
// 1 << bits - 1 == 4 = 0100
// d | 0100 = 10000 | 0100 = 10100
d = d | (1 << (bits - 1));
BitManipulate::showBinary(static_cast<int>(d));
return d;
}
某一位置取反
^
异或运算的运用^
异或运算 1 ^ 0 == 1 / 0 ^ 1 == 1 其余的情况都是 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/// 某一位取反
/// d 你要修改的数
/// bits 你要修改的位置
template<typename T>
T setBit2Negate(T d, int bits)
{
BitManipulate::showBinary(static_cast<int>(d));
// 转换过程
// ^ 异或运算 1 ^ 0 == 1 / 0 ^ 1 == 1 其余的情况都是 0
// d(15) == 1111 bits = 3
// 1 << bits - 1 == 0100
// 1111
// 0100 ^
// 1011
d = d ^ (1 << (bits - 1));
BitManipulate::showBinary(static_cast<int>(d));
return d;
}
参考
- [1] Github