舍入到2的最高功率只有二进制运算

时间:2016-03-27 05:31:55

标签: java

给出一个数字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;
}

2 个答案:

答案 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)代替-。在你的情况下避免减法。 (但这不会影响成本)