计算2的最大幂,它在C中均匀地除以数

时间:2009-10-11 21:07:10

标签: c bit-manipulation

给定偶数,我需要写一些逻辑来确定。两个最高的力量均匀地划分它。输入%2 ^ n == 0?

的最大值是2 ^ n

IE:
输入 - >输出

4  (0100)  -> 4

8  (1000)  -> 8

12 (1100)  -> 4

14 (1110)  -> 2

24 (11000) -> 8

etc....

看起来有一些按位逻辑可能会解决:当以二进制查看输入时,最右边的一位似乎是解决方案。如何在C中确定此值?还有其他解决方案可能更容易吗?

Thanks- 乔纳森

4 个答案:

答案 0 :(得分:18)

如果你愿意假设2的补码算法:

x & -x

如果你做了很多这类事情(或者即使你觉得它很有趣),找一本书“Hacker's Delight”。

编辑: avakar正确地指出,如果类型是无符号的,这不依赖于2的补码。该标准的相关部分是§6.2.5,第9段:

  

涉及无符号的计算   操作数永远不会溢出,因为a   无法表示的结果   得到的无符号整数类型是   减少模数是一个数   大于最大值   可以用结果来表示   类型。

“大于最大值的一个”为一个特别不正确的实现留下了一些摆动空间(例如,一个不使用二进制的实现),但是你很可能不会遇到这种情况。

答案 1 :(得分:7)

不使用浮点运算:

((x ^ (x - 1)) >> 1) + 1

简化和边缘情况留给读者练习。

答案 2 :(得分:6)

我们可以(-x)替换(~x + 1)

x & (~x+1) 

Low Level Bit Hacks You Absolutely Must Know提供详细说明。

答案 3 :(得分:3)

形式为2 ^ n的数字以二进制形式写入1,后跟一系列0或更多0。 例如,1,10,100,1000,......等都是2的幂。

要获得除以给定数字的最高2的幂,您可以执行以下两个步骤:

  1. 以二进制形式写入数字。例如,如果数字为168,请写入10101000。

  2. 在包含1的右侧第一位之前删除所有位。在168的情况下,在击出10101000的第一部分后剩下的是1000(十进制= 8)。

  3. 你的结果是什么 - 也就是说,2的最高权力除以数字。

    以编程方式,让x为您的输入数字。然后您所需的输出将是:x - (x ^ (x-1))

    说明:

    x ^ (x-1) [意为x XOR x-1]从LSB(最低有效位)侧摆脱前1

    x - (x ^ (x-1))摆脱剩下的部分,并且只保留LSB方面的前1位。