相关疑难解决方法(0)

什么是按位移位(位移)运算符以及它们如何工作?

我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......

我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.

bit-manipulation binary-operators operators bit-shift

1340
推荐指数
9
解决办法
67万
查看次数

意外的C/C++按位移位运算符结果

我想我会疯了.

我有一段代码需要创建一个(无符号)整数,其N后续位设置为1.确切地说,我有一个位掩码,在某些情况下,我想将它设置为一个实心的rnage.

我有以下功能:

void MaskAddRange(UINT& mask, UINT first, UINT count)
{
    mask |= ((1 << count) - 1) << first;
}
Run Code Online (Sandbox Code Playgroud)

简单来说:1 << count在二进制表示中100...000(零的数量是count),从这样的数字中减去1给出011...111,然后我们只是左移它first.

当满足以下明显限制时,上述结果应产生正确的结果:

first + count <= sizeof(UINT)*8 = 32

请注意,它也应该适用于"极端"情况.

  • 如果count = 0我们有(1 << count) = 1,因此((1 << count) - 1) = 0.
  • 如果count = 32我们有(1 << count) = 0,因为前导位溢出,并且根据C/C++规则,按位移位运算符不是循环的.然后 …

c bit-manipulation

6
推荐指数
1
解决办法
4820
查看次数