|
|
1
3
我认为这是最简单的比特操作,尽管你说这不是首选 假设32位整数,这里有一段漂亮的代码可以反转 所有 无需在32个步骤中完成:
本质上,这会对所有比特进行交错混洗。每次值中大约有一半的位与另一半进行交换。 最后一行是重新对齐位所必需的,以便bin“n”是最重要的位。 如果“n”是<=16或<8. |
|
|
2
2
这是我的解决方案 answer to a different question 它在不循环的情况下计算下一个比特反转索引。然而,它在很大程度上依赖于比特操作。
关键思想是,递增一个数字只会翻转一个最低有效位序列,例如
使用GCC的C示例
如果没有CTZ指令,您也可以使用整数除法:
|
|
|
3
2
在每一步中,找到值的最左侧0位数字。设置它,并清除它左侧的所有数字。如果你没有找到0位数字,那么你就溢出了:返回0,或停止,或崩溃,或任何你想要的。 这是在正常的二进制增量上发生的事情(我的意思是这是效果,而不是它在硬件中的实现方式),但我们是在左边而不是右边做的。
无论你是在bit操作、字符串还是其他什么中这样做,都取决于你。如果你在bitops中这样做,那么在
|
|
|
4
1
该解决方案最初是二进制的,并按照请求者的指定转换为传统数学。 作为二进制,它更有意义,至少乘2和除2应该<<1和>>对于速度,加法和减法可能并不重要。 如果你传入掩码而不是nBits,使用比特移位而不是乘法或除法,并将尾部递归更改为循环,这可能是你能找到的最有效的解决方案,因为每隔一次调用,它都只是一个加法,它只会像Alnitak的解一样慢,每4次,甚至8次调用。
哇,结果有点酷。直到最后一秒,我才理解递归。 这感觉是错误的——就像有些操作不应该工作,但它们是因为你正在做的事情的性质而工作的(就像当你在一个比特上操作时,感觉你应该遇到麻烦,而左边的一些比特是非零的,但事实证明,除非左边的所有比特都是零,否则你永远无法在比特上操作——这是一个非常奇怪的情况,但却是真的。 从110到001的流程示例(向后3到向后4):
|
|
|
5
0
|
|
6
0
也许从0递增到N(“通常”的方式),并对每次迭代执行ReverseBitOrder()。你可以找到几个实现 here (我最喜欢LUT)。 应该真的很快。 |
|
|
7
0
以下是Perl中的答案。你不会说在全1模式之后会发生什么,所以我只返回零。我去掉了位操作,这样它应该很容易翻译成另一种语言。
|
|
8
0
这里有一个解决方案,它实际上并没有尝试进行任何加法,而是利用了序列的开/关模式(大多数sig位每次交替,其次是sig位每隔一次交替,以此类推),根据需要调整n:
|
|
|
9
0
如果需要的话,在最高有效位加1,然后转到下一个(较低有效位)怎么样。您可以通过对字节进行操作来加快速度:
|
|
|
10
0
n是2的幂次方,x是你想要步进的变量:
我对此进行了彻底的评论,因为您可能不熟悉这种语法。 编辑 :这是尾部递归版本。如果你有一个具有尾部调用优化的编译器,它似乎会快一点。
|
|
|
11
0
当你倒车时
|
|
|
12
0
编辑:当然,原始海报的问题是要递增(反向)一,这比添加两个随机值更简单。所以nwellnhof的 answer 已包含该算法。 将两位反转值相加以下是php中的一个解决方案:
附注:见 this question 关于转移负值。 至于测试;从零开始,用8位倒1(10000000)递增值:
…将输出:
|
|
no one special · 32位整数缩放,无溢出 8 年前 |
|
|
Benn Tan · 比特操作:更难翻动硬币 8 年前 |
|
|
Ganesh Thampi · 使用位运算符将十进制转换为二进制 8 年前 |
|
|
Ganesh Thampi · 使用位的奇偶程序 8 年前 |
|
|
datapanda · 三维网格的莫顿反向编码 8 年前 |
|
|
rubyquartz · 交换无符号短整数的字节 8 年前 |
|
|
John Proctor · C中位的掩蔽范围 8 年前 |
|
|
Areg Sarvazyan · 从无符号int中提取位的函数 8 年前 |
|
|
user9505617 · 按位异或0xFFFFFFFF? 8 年前 |