给定偶数,我需要写一些逻辑来确定.两个最高的力量均匀地划分它.输入%2 ^ n == 0时,2 ^ n的最大值是多少?
IE:
输入 - >输出
4 (0100) -> 4
8 (1000) -> 8
12 (1100) -> 4
14 (1110) -> 2
24 (11000) -> 8
etc....
Run Code Online (Sandbox Code Playgroud)
看起来有一些按位逻辑可能会解决:当以二进制查看输入时,最右边的一位似乎是解决方案.如何在C中确定此值?还有其他解决方案可能更容易吗?
谢谢 - 乔纳森
Ste*_*non 19
如果你愿意假设2的补码算术:
x & -x
如果你做了很多这类事情(或者即使你觉得它很有趣),找一本书"Hacker's Delight"的副本.
编辑: avakar正确地指出,如果类型是无符号的,这不依赖于2的补码.该标准的相关部分是§6.2.5,第9段:
涉及无符号操作数的计算永远不会溢出,因为无法通过生成的无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
"大于最大值的一个"为一个特别不正确的实现留下了一些摆动空间(例如,一个不使用二进制的实现),但是你很可能不会遇到这种情况.
不使用浮点运算:
((x ^ (x - 1)) >> 1) + 1
Run Code Online (Sandbox Code Playgroud)
简化和边缘情况留给读者练习.