是否有更优雅的方式进行这些按位操作?

fel*_*ipe 1 c c++ java bit-manipulation

我构建了这个程序,对三个数字进行一些按位操作:2,4和20:

public static void main(String[] args) {
    int mask = 63;
    int id = 2;
    id = (id << 6) | 4;
    id = (id << 6) | 20;
    int v3 = id & mask;
    int v2 = (id >> 6) & mask;
    int v1 = (id >> 6*2) & mask;
    System.out.println(v1 + " " + v2 + " " + v3);
}
Run Code Online (Sandbox Code Playgroud)

我毫不怀疑按位操作,但我不知道这是否是最好的方法.有更优雅的方式进行这些操作吗?

Aln*_*tak 11

我假设你的意图是将三个六位值打包成一个int,在这种情况下:

public int pack(int v1, int v2, int v3) {
    return (v3 & 0x3f) <<  0 |
           (v2 & 0x3f) <<  6 |
           (v1 & 0x3f) << 12;
}

public void unpack(int n) {
    int v3 = (n >>  0) & 0x3f;
    int v2 = (n >>  6) & 0x3f;
    int v1 = (n >> 12) & 0x3f;
    // do stuff with v1, v2, v3
}
Run Code Online (Sandbox Code Playgroud)

它的功能与你的代码大致相同,说实话,但我希望意图更加清晰.

<< 0>> 0操作应该由编译器被优化掉,但显示了"对称"