相关疑难解决方法(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万
查看次数

有没有办法在C#中执行循环位移?

我知道以下是真的

int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010
Run Code Online (Sandbox Code Playgroud)

但是,如果你换得太远,那些位就会掉线.发生这种情况的原因与您正在使用的整数大小有关.

有没有办法执行移位,以便位旋转到另一侧?我正在寻找一个单独的操作,而不是for循环.

c# bit-manipulation

34
推荐指数
3
解决办法
2万
查看次数

C#二进制移位自动旋转

我搜索了在C#中进行二进制旋转移位的方法,并得到了很好的答案,如/sf/answers/56842761//sf/answers/2462071/

我想为这个场景创建一个测试用例,其中一个非旋转的移位将作为一个负面测试,但后来我偶然发现这个事实:

public static void Main()
{
    Debug.WriteLine("1<<31 = " + Convert.ToString(1 << 31, 2).PadLeft(32, '0'));
    Debug.WriteLine("1<<32 = " + Convert.ToString(1 << 32, 2).PadLeft(32, '0'));
}
Run Code Online (Sandbox Code Playgroud)

提供以下输出:

1<<31 = 10000000000000000000000000000000
1<<32 = 00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)

现在,这些看起来很奇怪,因为有许多答案提供了二进制移位和旋转的方法,如二进制OR等技巧.但似乎.NET的默认行为是旋转.

这个行为是否在.NET的新版本中发生了变化?我在Visual Studio 2010中尝试过这个到.NET 2.0,它总是显示上面的行为.

如果这是默认行为,为什么人们为旋转位创建了"聪明"的解决方案?我在这里错过了什么吗?

c# bit-manipulation rotation

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

标签 统计

bit-manipulation ×3

c# ×2

rotation ×2

c ×1

c++ ×1

c++-faq ×1