算法通关村第十一关——常见位操作技巧笔记

20 阅读1分钟

>>>和>>的区别

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"

保留原值的方法

  • val | 0 等于 val(因为任何数与0进行按位或操作都会保持不变)。
  • val & 1 也等于 val(因为1与1按位与得1,0与1按位与得0)。

获取index[i]

boolean getBit(int num, int i) {
    return ((num & (1 << i)) != 0);
}

image.png

设置index[i]为1

int setBit(int num, int i){
    return num | (1 << i);
}

image.png

设置index[i]为0

int clearBit(int num, int i){
    int mask = ~(1 << i);
    return num & mask;
}

image.png

设置index[i]为新值v

int updateBit(int num, int i, int v){
    int mask = ~(1 << i);
    return (num & mask) | (v << i);
}

image.png