Skip to content

按位与 &

Preview
Preview
Preview

按位或 |

Preview
Preview
Preview
Preview
Preview
Preview
Preview
Preview

按位异或 ^

按位异或

按位取反 ~

c
int a = 5;  // 0000 0101(假设8位)
int b = ~a; // 1111 1010(补码表示,十进制-6)

右移

右移运算


检查整数num的第i位(二进制表示)是否为1,是返回true,否则返回false
java

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


// 返回i位bit位的值0、1
boolean getBit(int num, int i) {
  return (num & (1 << i));
}
将整数num的第i位置为1
java

int setBit(int num, int i) {
  return (num | (1 << i));
}
将整数num的第i位置为0
java

// 这个函数为什么可以将i位设置为0呢?
// 因为1左移i位后按位取反了,比如说相当于111111011111,其中的0是1左移之后取反是0
// 再按位与,除了0这个位置,原num是0的,还是0,因为0&1; 是1的,还是1,因为1&1
// 在0这个位置,原来是1的,变成了0,因为1&0,原来是0的,保持0,因为0&0
int clearBit(int num, int i) {
  return (num & ~(1 << i));
}
更新: 将整数 num 的第 i 位(二进制位)更新为值 v(v 为 0 或 1)
java

// 这里面,(num & mask)为清除旧位
//  | (v << i) 为设置新位
// (num & mask)会将i位设置为0,也就是清除了旧位
// (num & mask) | (v << i) 这里,如果v是0,v左移i位后,与(num & mask)按位或,原位都会保持不变,i位因为前置为0了,所以按位或还是0
// (num & mask) | (v << i) 这里,如果v是1,v左移i位后,与(num & mask)按位或,原位都会保持不变,i位前置位0,与1或运算,为1
int updateBit(int num, int i, int v) {
    int mask = ~(1 << i);      // 步骤1:生成掩码
    return (num & mask) | (v << i); // 步骤2:清除旧位 + 设置新位
}

位运算加法

演示代码

位运算乘法

演示代码

两数相除,采用二分查找的方式解决