Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在数字的子段[i,j]周围创建遮罩_C++_Bit Manipulation - Fatal编程技术网

C++ 在数字的子段[i,j]周围创建遮罩

C++ 在数字的子段[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

我目前正在学习位操作和位运算符,并且正在研究一个实践问题,其中必须将int m的一个子段[I,j]合并到[I,j]处的N中。我以线性方式创建了掩码,但在谷歌搜索后,我发现~0
~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))