#### 前言 >在实现java语言下BitMap过程中,用到了一些位运算,这里记录一下 #### 操作符及规则 以下是基本的位操作运算符及其操作规则: ##### 按位与 : & - 规则 : 按位与处理两个长度相同的二进制数,两个相应的二进位都为1,该位的结果值才为1,否则为0。 - 例如 : `101 & 011 = 001` ##### 按位或 : | - 规则 : 按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。 - 例如 : `101 & 011 = 111` ##### 按位取反 : ~ - 规则 : 取反是一元运算符, 对一个二进制数的每一位执行逻辑反操作。使数字1成为0, 0成为1。 - 例如 : `~101 = 010` ##### 按位异或 : ^ - 规则 : 按位异或运算,对等长二进制模式按位或二进制数的每一位执行逻辑异按位或操作,操作的结果是如果某位不同则该位为1,否则该位为0。 - 例如 : `101 ^ 011 = 110` ##### 左移 : << - 规则 :按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。 - 例如 (以java中int为例): `5 << 2 = 20`, 即 `00000000000000000000000000000101 << 2 = 00000000000000000000000000010100`; `-5 >> 2 = -20`, 即 `11111111111111111111111111111011 << 2 = 11111111111111111111111111101100` ##### 右移 : >> - 规则 :按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。 - 例如 (以java中int为例): `5 >> 2 = 1`, 即 `00000000000000000000000000000101 >> 2 = 00000000000000000000000000000001`; `-5 >> 2 = -2`, 即 `11111111111111111111111111111011 >> 2 = 11111111111111111111111111111110` ##### 无符号右移 : >>> - 规则 :按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。 其他结构和>>相似。 - 例如 (以java中int为例): `5 >>> 2 = 1`, 即 `00000000000000000000000000000101 >> 2 = 00000000000000000000000000000001`; `-5 >>> 2 = 1073741822`, 即 `11111111111111111111111111111011 >> 2 = 00111111111111111111111111111110` #### BitMap下涉及的位操作 ```java /** * 置oldValue指定bit位的值为指定值 * @param oldValue 旧int值 * @param bitIndex 目标bit位 * @return 返回新int值 */ public static int setIntegerBitValue(int oldValue, int bitIndex, int bitvalue) { int result = oldValue; if (bitvalue == 0) { if (getIntegerBitValue(oldValue, bitIndex) == 1) { // 1 -> 0 使用 '&' result = oldValue & (-1 - (1 << bitIndex)); // result = oldValue & (~(1 << bitIndex)); } } if (bitvalue == 1) { if (getIntegerBitValue(oldValue, bitIndex) == 0) { // 0 -> 1 使用 '|' result = oldValue | (1 << bitIndex); } } return result; } /** * 获取intVal指定bit位的值【0/1】 * @param intVal * @param bitIndex 从低位到高位bit位索引 * @return 指定bit位值:0 或 1 */ public static int getIntegerBitValue(int intVal, int bitIndex) { return (intVal >>> bitIndex) & 1; } ``` #### 参考 [位操作-百度百科](https://baike.baidu.com/item/%E4%BD%8D%E6%93%8D%E4%BD%9C/10611735?fr=aladdin#2_3 "位操作-百度百科") [左移-百度百科](https://baike.baidu.com/item/%E5%B7%A6%E7%A7%BB%E8%BF%90%E7%AE%97%E7%AC%A6/7726536?fr=aladdin "左移-百度百科") [面试题:如何在一千万个不重复整数(电话号码)中查找某个特定数 位运算 bitmap](https://blog.csdn.net/yangliuy/article/details/42874221 "面试题:如何在一千万个不重复整数(电话号码)中查找某个特定数 位运算 bitmap") [位运算总结](http://blog.tomtung.com/2007/05/bitwise-operation/ "位运算总结") [位操作基础篇之位操作全面总结](https://blog.csdn.net/morewindows/article/details/7354571 "位操作基础篇之位操作全面总结") [Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)](https://blog.csdn.net/qq_35114086/article/details/70173329 "Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)") :bowtie: ------------ > 本文由 [叶不空](https://yebukong.com "叶不空") 创作,采用 [知识共享署名 4.0 国际许可协议](https://creativecommons.org/licenses/by/4.0/ "知识共享署名 4.0 国际许可协议")进行许可,转载请附上链接! > 本文链接: [https://yebukong.com/article/1141312234358697986.html](https://yebukong.com/article/1141312234358697986.html "有关位运算的简单笔记")