位运算 - 基础
2022-05-03 本文已影响0人
BruceOuyang
一、位逻辑运算
1、与运算: a & b
与运算,对应位都为 1,结果为 1,否则为 0
相当于一般逻辑运算符 and ,把 1 视为 true, 把 0 视为 false
12 & 8 = 8
0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
& 0000 0000 0000 0000 0000 0000 0000 1000 -> 十进制 8 的二进制形式
———————————————————————————————————————————————
0000 0000 0000 0000 0000 0000 0000 1000
2、或运算: a | b
或运算,对应位含有 1,结果为 1,否则为 0
相当于一般逻辑运算符 or ,把 1 视为 true, 把 0 视为 false
12 | 8 = 12
0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
| 0000 0000 0000 0000 0000 0000 0000 1000 -> 十进制 8 的二进制形式
———————————————————————————————————————————————
0000 0000 0000 0000 0000 0000 0000 1100
3、取反运算: ~a
取反运算,对应位为 1,结果为 0,否则为 1
相当于一般逻辑运算符 ! ,把 1 视为 true, 把 0 视为 false
~12 = -13
~ 0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
———————————————————————————————————————————————
1111 1111 1111 1111 1111 1111 1111 0011
4、异或运算: a ^ b
异或运算,对应位值相同,结果为 0,否则为 1
相当于一般逻辑运算符 equals ,把 1 视为 true, 把 0 视为 false
12 ^ 8 = 4
0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
^ 0000 0000 0000 0000 0000 0000 0000 1000 -> 十进制 8 的二进制形式
———————————————————————————————————————————————
0000 0000 0000 0000 0000 0000 0000 0100
二、位移运算
1、左移运算: a << n
左移运算,对应位整体向左移动 n 位,低位补 0, 高位溢出的舍去
相当于乘以 2 的 n 次方
12 << 2 = 48
<< 2 0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
———————————————————————————————————————————————————————
0000 0000 0000 0000 0000 0000 0011 0000
2、右移运算: a >> n
正数右移运算,对应位整体向右移动 n 位,高位补 0, 低位溢出的舍去
相当于除以 2 的 n 次方
12 >> 2 = 3
>> 2 0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
———————————————————————————————————————————————————————
0000 0000 0000 0000 0000 0000 0000 0011
负数右移运算,对应位整体向右移动 n 位,高位补 1, 低位溢出的舍去
-12 >> 2 = -3
>> 2 1111 1111 1111 1111 1111 1111 1111 0011 -> 十进制 -12 的二进制形式
———————————————————————————————————————————————————————
1111 1111 1111 1111 1111 1111 1111 1100
3、无符号右移运算: a >>> n
无符号右移运算,对应位整体向右移动 n 位,高位补 0, 低位溢出的舍去
相当于除以 2 的 n 次方
12 >>> 2 = 3
>>> 2 0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
———————————————————————————————————————————————————————
0000 0000 0000 0000 0000 0000 0000 0011
-12 >>> 2 = 1073741821
>>> 2 1111 1111 1111 1111 1111 1111 1111 0011 -> 十进制 -12 的二进制形式
———————————————————————————————————————————————————————
0011 1111 1111 1111 1111 1111 1111 1100
三、极端位移测试
1、左移运算: a << n, n > 32
左移运算,对应位整体向左移动 n 位,低位补 0, 高位溢出的舍去
若 n > 32, 相当于乘以 2 的 n % 32 次方
12 << 27 = 1610612736
12 << 30 = 0
12 << 32 = 12
12 << 33 = 24
12 << 64 = 12
12 << 96 = 12
0000 0000 0000 0000 0000 0000 0000 1100 -> 十进制 12 的二进制形式
四、低精度整型位移运算
低精度整数做位移操作会有溢出,因此低精度的数据类型不适合用于位运算
1、byte 无符号右移
byte -32 >>> 1 = -16
2、short 无符号右移
short -128 >>> 1 = -64
附、基本数据类型
基本类型 | 字节数 | 位数 |
---|---|---|
byte | 1byte | 8bit |
short | 2byte | 16bit |
int | 4byte | 32bit |
long | 8byte | 64bit |
float | 4byte | 32bit |
double | 8byte | 64bit |
char | 2byte | 16bit |
对于所有的位运算,操作的都是二进制的数据,如果数据为其他进制,会先转换为二进制再做计算
原文来自我的github仓库:https://github.com/BruceOuyang/issuelist/issues/114
已更新到我的个人站点:https://bruce.bugmakers.club