Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 四舍五入到仅2次二进制运算的最高幂_Java - Fatal编程技术网

Java 四舍五入到仅2次二进制运算的最高幂

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 >>

给定一个数字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 >> 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。谢谢你记得我。