C++ 在数字的子段[i,j]周围创建遮罩
我目前正在学习位操作和位运算符,并且正在研究一个实践问题,其中必须将int m的一个子段[I,j]合并到[I,j]处的N中。我以线性方式创建了掩码,但在谷歌搜索后,我发现~0C++ 在数字的子段[i,j]周围创建遮罩,c++,bit-manipulation,C++,Bit Manipulation,我目前正在学习位操作和位运算符,并且正在研究一个实践问题,其中必须将int m的一个子段[I,j]合并到[I,j]处的N中。我以线性方式创建了掩码,但在谷歌搜索后,我发现~0~0是“所有1位”的数字。将其上移j时,将最低有效j位转换为0: 1111111111111111 == ~0 == ~0 << 0 1111111111111110 == ~0 << 1 1111111111100000 == ~0 << 5 11111111100000
~0
是“所有1
位”的数字。将其上移j
时,将最低有效j
位转换为0
:
1111111111111111 == ~0 == ~0 << 0
1111111111111110 == ~0 << 1
1111111111100000 == ~0 << 5
1111111110000000 == ~0 << 7
当你从中减去1时,有一个从左边一路带过来的1,因此在1变为1之前,你剩下的是所有的位(因此你最后打开了第一个i
最低有效位)
当使用此掩码对数字进行&
时,清除范围(i,j)中的位(不包括i
th位本身)
当你~
屏蔽时,你会得到一个新的屏蔽,它只会给你范围(i,j)中的位
111111 0000111===0个副本:,
1111111111111111 == ~0 == ~0 << 0
1111111111111110 == ~0 << 1
1111111111100000 == ~0 << 5
1111111110000000 == ~0 << 7
0000000000000001 == 1 << 0
0000000000000010 == 1 << 1
0000000000001000 == 1 << 3
0000000001000000 == 1 << 6
0000000000000000 == (1 << 0) - 1
0000000000000001 == (1 << 1) - 1
0000000000000111 == (1 << 3) - 1
0000000000111111 == (1 << 6) - 1
1111111110000000 == ~0 << 7
0000000000000111 == (1 << 3) - 1
1111111110000111 == ~0 << 7 | ((1 << 3) - 1)
7 3
1111111110000111 == ~0 << 7 | ((1 << 3) - 1)
0000000001111000 == ~(~0 << 7 | ((1 << 3) - 1))