给出一个数字x 舍入到2的最高幂,不高于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);
}
第2版
public static int maxPowerOf2(int x)
{
int v=x;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v= v>>1;
int m16=~v;
v=v<<1;
v=v&m16;
return v;
}
答案 0 :(得分:2)
这里只是使用二进制操作的解决方案..虽然它非常接近版本1:
Sequel.migration do
up do
alter_table :same_table do
# ⇓⇓ NOTE SYMBOL
add_column :not_working, :jsonb
end
end
end
Sequel.migration do
up do
create_table :same_table do
# ⇓ NOTE DOWNCASE
jsonb :worked
end
end
end
在这种情况下,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 :(得分: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);
r
会保留您的结果。
使用长片时,您需要使用0xFFFFFFFF
请不要使用^
(XOR)代替-
。在你的情况下避免减法。 (但这不会影响成本)