有关位运算的简单笔记

#### 前言
>在实现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 "有关位运算的简单笔记")
                        
(°ο°)评论插件未能完成加载!