|
|
1
13
C中没有旋转运算符,但如果您写:
那么,根据这个: http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf (第56页),编译器将只在一条(非常快)指令中计算出您想要做什么并执行旋转。 |
|
|
2
11
阅读到目前为止的答案和评论,人们似乎对你想要完成的事情有些困惑——这可能是因为你使用的词汇。在位操作中,有几个“标准”的事情你可以做。我将对其中一些进行总结,以帮助澄清不同的概念。
在接下来的所有事情中,我将使用
(一)
移位
:这实际上是“快速乘或除以2的幂”。使用的符号是
(相当于“除以四”)和
(相当于“乘8”-假设有“空间”来移动
2个) 位掩蔽 :有时需要将某些位设置为零。通过对一个数字执行AND操作来实现此目的,该数字的一个要保留一位,而零个要清除一位。
或者,如果要确保某些位是一位,可以使用或操作:
三) 循环移位 :这有点棘手-有些情况下,您希望“移动位”,而“一端脱落”的出现在另一端。在C语言中没有这个符号,也没有“快速指令”(尽管大多数处理器都有一个内置指令,汇编代码可以利用它进行FFT计算等)。如果要执行三个位置的“左循环移位”:
(注:没有
(四) 位反转 :有时需要反转数字中的位。反转位时,没有“左”或“右”-反转:
同样,标准C库中实际上没有“reverse”函数。
现在,让我们看看实现最后两个函数的一些技巧(
这使用了上面的两个技巧:移位位和使用OR操作将位设置为特定值。让我们看看它是如何工作的,对于n=3(注意-我忽略第8位以上的位,因为函数的返回类型是
从这两个给
这正是我们想要的结果。还要注意
现在让我们看看
你可以问自己“刚刚发生了什么”??? 让我给你看看:
注意,我们现在所有的比特都只有一次-它们只是在一个相当奇怪的模式。模1023的除法将感兴趣的部分“折叠”在一起,就像魔术一样,我无法解释。结果确实是
一个稍微不那么晦涩的方法来实现同样的事情(效率较低,但对较大的数字却相当有效)会发现,如果你交换相邻的位,然后交换相邻的位对,然后交换相邻的半字节(4位组),等等,你最终会得到一个完全的位反转。在这种情况下,字节反转变成
在这种情况下,字节发生以下情况
下一行:
最后一行:
这是你要找的反向字节。我们应该很容易就能看出,多出几行(与上面类似)就可以得到一个反向整数(32位)。随着数字大小的增加,相对而言,这个技巧变得越来越有效。 我相信你要找的答案是上面的“某处”。如果没有别的,我希望你能更清楚地理解C语言中位操作的可能性。 |
|
|
3
1
如果根据您的评论,您希望准确地移动一点,那么实现这一点的一个简单方法是:
你的代码所做的是反转位,而不是旋转位。例如,它将使10111001变为10011101,而不是0111011。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |