给定偶数,我需要写一些逻辑来确定。两个最高的力量均匀地划分它。输入%2 ^ n == 0?
的最大值是2 ^ n IE:
输入 - >输出
4 (0100) -> 4
8 (1000) -> 8
12 (1100) -> 4
14 (1110) -> 2
24 (11000) -> 8
etc....
看起来有一些按位逻辑可能会解决:当以二进制查看输入时,最右边的一位似乎是解决方案。如何在C中确定此值?还有其他解决方案可能更容易吗?
Thanks- 乔纳森
答案 0 :(得分:18)
如果你愿意假设2的补码算法:
x & -x
如果你做了很多这类事情(或者即使你觉得它很有趣),找一本书“Hacker's Delight”。
编辑: avakar正确地指出,如果类型是无符号的,这不依赖于2的补码。该标准的相关部分是§6.2.5,第9段:
涉及无符号的计算 操作数永远不会溢出,因为a 无法表示的结果 得到的无符号整数类型是 减少模数是一个数 大于最大值 可以用结果来表示 类型。
“大于最大值的一个”为一个特别不正确的实现留下了一些摆动空间(例如,一个不使用二进制的实现),但是你很可能不会遇到这种情况。
答案 1 :(得分:7)
不使用浮点运算:
((x ^ (x - 1)) >> 1) + 1
简化和边缘情况留给读者练习。
答案 2 :(得分:6)
答案 3 :(得分:3)
形式为2 ^ n的数字以二进制形式写入1,后跟一系列0或更多0。 例如,1,10,100,1000,......等都是2的幂。
要获得除以给定数字的最高2的幂,您可以执行以下两个步骤:
以二进制形式写入数字。例如,如果数字为168,请写入10101000。
在包含1的右侧第一位之前删除所有位。在168的情况下,在击出10101000的第一部分后剩下的是1000(十进制= 8)。
你的结果是什么 - 也就是说,2的最高权力除以数字。
以编程方式,让x为您的输入数字。然后您所需的输出将是:x - (x ^ (x-1))
说明:
x ^ (x-1)
[意为x XOR x-1]从LSB(最低有效位)侧摆脱前1
x - (x ^ (x-1))
摆脱剩下的部分,并且只保留LSB方面的前1位。