Java 四舍五入到仅2次二进制运算的最高幂
给定一个数字x 四舍五入到不高于x的2的最高幂。 我找到了一个简单的解决方案,但我想知道是否有可能不使用“-”运算,只使用 >>, >>>, > 1; v |=v>>2; v |=v>>4; v |=v>>8; v |=v>>16; v=v>>1; int m16=~v;Java 四舍五入到仅2次二进制运算的最高幂,java,Java,给定一个数字x 四舍五入到不高于x的2的最高幂。 我找到了一个简单的解决方案,但我想知道是否有可能不使用“-”运算,只使用 >>, >>>, > 1; v |=v>>2; v |=v>>4; v |=v>>8; v |=v>>16; v=v>>1; int m16=~v; 这里有一个只使用二进制运算的解决方案。。尽管它与版本1非常接近: public static int maxPowerOf2(int x) { x |= x >> 1; x |= x >>
这里有一个只使用二进制运算的解决方案。。尽管它与版本1非常接近:
public static int maxPowerOf2(int x) {
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x ^ (x >> 1);
}
在这种情况下,
^
实现了与算术减法相同的功能这里有一个仅使用二进制运算的解决方案。。尽管它与版本1非常接近:
public static int maxPowerOf2(int x) {
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x ^ (x >> 1);
}
在这种情况下,
^
实现了与算术减法相同的功能您要寻找的是识别x
中的最高位集您的代码是对32位值执行此操作的变体 最快的解决方案是使用查找表。最实际的方法是使用二叉搜索树。又名:
int v = x:
int r = 0;
int shift = 0;
r = (v > 0xFFFF) ? 1 << 4 : 0; v >>= r;
shift = (v > 0xFF ) ? 1 << 3 : 0; v >>= shift; r |= shift;
shift = (v > 0xF ) ? 1 << 2 : 0; v >>= shift; r |= shift;
shift = (v > 0x3 ) ? 1 << 1 : 0; v >>= shift; r |= shift;
r |= (v >> 1);
int v=x:
int r=0;
int-shift=0;
r=(v>0xFFFF)?1>=r;
移位=(v>0xFF)?1>=移位;r |=移位;
移位=(v>0xF)?1>=移位;r |=移位;
移位=(v>0x3)?1>=移位;r |=移位;
r |=(v>>1);
r
将保留您的结果
对于long,您需要使用0xFFFFFFFF
请不要使用
^
(XOR)而不是-
。在你的情况下避免减法。(但这并不会真正影响成本)您需要的是识别x
中设置的最高位您的代码是对32位值执行此操作的变体 最快的解决方案是使用查找表。最实际的方法是使用二叉搜索树。又名:
int v = x:
int r = 0;
int shift = 0;
r = (v > 0xFFFF) ? 1 << 4 : 0; v >>= r;
shift = (v > 0xFF ) ? 1 << 3 : 0; v >>= shift; r |= shift;
shift = (v > 0xF ) ? 1 << 2 : 0; v >>= shift; r |= shift;
shift = (v > 0x3 ) ? 1 << 1 : 0; v >>= shift; r |= shift;
r |= (v >> 1);
int v=x:
int r=0;
int-shift=0;
r=(v>0xFFFF)?1>=r;
移位=(v>0xFF)?1>=移位;r |=移位;
移位=(v>0xF)?1>=移位;r |=移位;
移位=(v>0x3)?1>=移位;r |=移位;
r |=(v>>1);
r
将保留您的结果
对于long,您需要使用0xFFFFFFFF
请不要使用
^
(XOR)而不是-
。在你的情况下避免减法。(虽然这不会真正影响成本)你所说的“2的次高幂不高于x”是什么意思,那么对于3
,它是2还是4?对于3是2,对于17是16等等,我以前在哪里见过这个?哦,是的。很高兴在现实生活中看到类似的问题,但它有点不同。你的意思是?你所说的“2的次高幂不高于x”是什么意思,所以对于3
,它是2还是4?对于3是2,对于17是16等等。我以前在哪里见过这个?哦,是的。很高兴在现实生活中看到类似的问题,但有点不同。你是说?谢谢。但是是C吗?我的意思是v>0xFFFF-布尔值,对吗?一点也没有,上星期吃了太多的C。将其更改为符合java。谢谢你记得我,谢谢你。但是是C吗?我的意思是v>0xFFFF-布尔值,对吗?一点也没有,上星期吃了太多的C。将其更改为符合java。谢谢你记得我。