相关疑难解决方法(0)

C++中循环移位(旋转)操作的最佳实践

左右移位运算符(<<和>>)已在C++中可用.但是,我无法找到如何执行循环移位或旋转操作.

如何执行"向左旋转"和"向右旋转"等操作?

在这里向右旋转两次

Initial --> 1000 0011 0100 0010
Run Code Online (Sandbox Code Playgroud)

应该导致:

Final   --> 1010 0000 1101 0000
Run Code Online (Sandbox Code Playgroud)

一个例子会有所帮助.

(编者注:如果旋转计数为零,许多常见的表达方式在C中旋转会受到未定义的行为的影响,或者编译为不止一个旋转机器指令.这个问题的答案应记录最佳实践.)

c c++ bit-manipulation c++-faq rotation

84
推荐指数
9
解决办法
10万
查看次数

生成位掩码的算法

我正面临着这个基于输入参数生成位掩码的独特问题.例如,

如果param = 2,那么如果param = 5,则掩码将为0x3(11b),然后掩码将为0x1F(1 1111b)

这是我在C中使用for循环实现的

int nMask = 0;
for (int i = 0; i < param; i ++) {

    nMask |= (1 << i);
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的算法~~~

algorithm bit-manipulation

43
推荐指数
4
解决办法
5万
查看次数

在unsigned int中设置最后的`n`位

如何设置(以最优雅的方式)n最不重要的位uint32_t?那就是写一个函数void setbits(uint32_t *x, int n);.函数应该处理每一个n032.

尤其n==32应该处理价值.

c c++ gcc bitwise-operators

13
推荐指数
4
解决办法
1万
查看次数

C标准对于比特类型宽度的位移更多的比特说了些什么?

请考虑以下代码:

int i = 3 << 65;
Run Code Online (Sandbox Code Playgroud)

我希望结果是i==0,但实际结果是i==6.通过一些测试,我发现使用以下代码:

int i, s;
int a = i << s;
int b = i << (s & 31);
Run Code Online (Sandbox Code Playgroud)

ab始终是相同的.

C标准是否说过关于移位超过32位(类型的宽度int)的任何内容,还是这种未指定的行为?

c bit-shift

10
推荐指数
1
解决办法
1651
查看次数