1
8
如果保证输入正好有2或3位,那么答案可以很快计算出来。我们利用表达式x&(x-1)等于清除LSB后的x。如果设置了2个或更少的位,则对输入应用该表达式两次将产生0。如果正好设置了2位,则返回原始输入。否则,我们返回LSB被清除的原始输入。
|
2
4
我会在一个循环中创建一个面具。开始时,掩码为0。然后从MSB到LSB,将掩码中的每个对应位设置为1,直到找到2个设置位。最后是这个掩码的值。
当然,如果内存不是问题的话,可以使用一些推荐的查找表方法—这会快得多。 |
3
1
但说真的:如果要对100个数字执行此操作,则只需要一个8位查找表提供2 msb,另一个8位查找表提供1 msb。根据处理器的不同,这可能会超过真正的计数位。
如果设置了1或0位,M(I)=0 M(I)=B'否则,其中B'是设置了2个msb位的B的值。
32位int是4个输入字节I1 I2 I3 I4。
总结:2个查找表,256个条目,247/256个案例通过一次查找解决,大约8/256个案例通过两次查找解决,等等。 编辑: 表,为清楚起见(输入,位表2 MSB,位表1 MSB)
|
4
1
|
5
1
|
6
0
使用变量 this ,我得出如下结论:
编辑我不太确定我是否回答了你的问题。这将获取最高的位并保留它和它旁边的位,例如101=>100 |
7
0
下面是一些可以工作的python:
它使一个人越过这个数字。它构建了一个交叉位的掩码,这样一旦到达第二个最重要的位,它就可以屏蔽掉底部的位。
|
8
0
我也会使用基于表的方法,但我相信一个表就足够了。以4位为例。如果您的输入保证有2或3位,那么您的输出只能是6个值中的一个
将这些可能的值放入按大小排序的数组中。从最大值开始,找到第一个等于或小于目标值的值。这是你的答案。对于8位版本,您将有更多可能的返回值,但仍然容易小于8*7的最大可能排列。
|
9
0
|
10
0
使用 "The best method for counting bits in a 32-bit integer" ,如果答案是3,则清除低位。仅在输入限制为2或3位设置时工作。
|
no one special · 32位整数缩放,无溢出 6 年前 |
Benn Tan · 比特操作:更难翻动硬币 6 年前 |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 6 年前 |
Ganesh Thampi · 使用位的奇偶程序 6 年前 |
datapanda · 三维网格的莫顿反向编码 6 年前 |
rubyquartz · 交换无符号短整数的字节 6 年前 |
John Proctor · C中位的掩蔽范围 6 年前 |
Areg Sarvazyan · 从无符号int中提取位的函数 6 年前 |
user9505617 · 按位异或0xFFFFFFFF? 6 年前 |