![]() |
1
93
对于32位整数,这是一个简单而简单的路由:
下面是一个更具体的例子。让我们取221这个数字,它是11011101,二进制的:
在第九个位置有一个位,代表2^8,或者 256,实际上是2的第二大幂 . 每个移位将数字中所有现有的1位与一些以前未触及的零重叠,最终产生一个1位的数字,等于原始数字中的位数。在该值上加一将产生2的新幂。 另一个例子;我们将使用131,即二进制中的1000001:
实际上,256是仅次于131的2的最高功率。
如果用于表示整数的位数本身是2的幂,则可以继续有效地无限期地扩展此技术(例如,添加
|
![]() |
2
29
实际上,这是一个汇编解决方案(从80386指令集开始)。 您可以使用bsr(位扫描反向)指令扫描整数中最重要的位。
(摘自: http://dlc.sun.com/pdf/802-1948/802-1948.pdf ) 结果加上1。 所以:
在较新的CPU中,您可以更快地使用
|
![]() |
3
21
一种更为数学化的方法,没有循环:
|
![]() |
4
13
这是一个逻辑答案:
|
![]() |
5
8
这是John Feminella的答案,实现为一个循环,因此它可以处理 Python's long integers :
如果n已经是2的幂,则返回速度也更快。 对于python>2.7,这对于大多数n来说都是简单和快速的:
|
![]() |
6
3
这是一个没有循环但使用中间浮点的野生循环。
这一点,以及许多其他的琐碎的黑客,包括约翰·费米内拉提交的on,都可以找到。 here . |
![]() |
7
2
假设x不是负数。
|
![]() |
8
2
如果使用gcc、mingw或clang:
如果使用微软Visual C++,请使用函数
|
![]() |
9
1
|
![]() |
10
1
你说有点无聊?
每个循环直接剥离最低有效位。注意:这只适用于有符号的数字被编码为二的补码的情况。 |
![]() |
11
1
大于/大于或等于
以下代码段用于
下一个数字k>n这样k=2^i
如果你想要
2的最小幂大于或等于n
那就换一个吧
使用GCC或Clang(64位)的C++ 11
增强使用
|
![]() |
12
0
像这样的东西怎么样:
|
![]() |
13
0
您只需要找到最重要的位,然后将其左移一次。下面是一个Python实现。我认为x86有一个获取MSB的指令,但这里我将用纯Python实现它。一旦你有了最高有效位,就很容易了。
|
![]() |
14
0
算了吧!它使用循环!
|
![]() |
15
0
|
![]() |
16
-3
|
![]() |
17
-3
甚至
|
![]() |
no one special · 32位整数缩放,无溢出 7 年前 |
![]() |
Benn Tan · 比特操作:更难翻动硬币 7 年前 |
![]() |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 7 年前 |
![]() |
Ganesh Thampi · 使用位的奇偶程序 7 年前 |
![]() |
datapanda · 三维网格的莫顿反向编码 7 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 7 年前 |
|
John Proctor · C中位的掩蔽范围 7 年前 |
![]() |
Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 |
|
user9505617 · 按位异或0xFFFFFFFF? 7 年前 |