本文主要介绍了Java中位运算的相关内容,以及位运算的底层实现
位运算的介绍
java 中有 7 个位运算:
- 按位与:&===》两位全是1,结果为1,否则为0
- 按位或:|===》两位有一个为1,结果为1,否则为0
- 按位异或:^===》两位一个为0,一个为1,结果为1,否则为0
- 按位取反:~===》0->1,1->0
- (
位运算符)算术右移:>>:低位溢出,符号位不变,并用符号位补溢出的高位 - (
位运算符)算术左移:<<:符号位不变,低位补 0 - (
位运算符)无符号右移:>>>:逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0
特别说明:没有 <<< 符号
位运算的初步认识
public static void main(String[] args) {
int a = 1 >> 2; // 1 åå³ä½ç§» 2 ä½
int b = -1 >> 2;//ç®æ¯å³ç§»
int c = 1 << 2;//ç®æ¯å·¦ç§»
int d = -1 << 2;//
int e = 3 >>> 2;//æ 符å·å³ç§»
// a,b,c,d,e ç»ææ¯å¤å°
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
System.out.println("d=" + d);
System.out.println("e=" + e);
System.out.println(~-2);
System.out.println(~2);
}
java中的7 个位运算案例介绍
- 按位与:& ===》两位全是1,结果为1,否则为0
/** * 10010001 (一个字节有8位。一个数代表一个bit) * 11110010 * —————————— * 10010000 * */
- 按位或:| ===》两位有一个是1,结果为1,否则为0
/** * 10010001 (一个字节有8位。一个数代表一个bit) * 11110010 * —————————— * 11110011 * */
- 按位异或:^ ===》两位一个为0,一个位1,结果为1,否则为0
/** * 10010001 (一个字节有8位。一个数代表一个bit) * 11110010 * —————————— * 01100011 */
- 按位取反:~ ===》0->1,一1->(0变为1,1变为0);
/** * 10010001 * ———————————— * 01101110 */
其他的类似,就不一一列举了
位运算的底层推导过程
此处要回顾一下,7基本数据类型对应多占用的字节数。
byte(1byte)->char(2byte)->int(4byte)->short(2byte)->long(8byte)->double(8byte)->float(4byte)
8bit 16bit 32bit 16bit 64bit 64bit 32bit
- 案例1:按位&,2 & 3的推导过程
//1. 先得到2的补码==》得到2的补码前提需要得到2的原码:00000000 00000000 00000000 00000010 // 得到2的补码(正数三码合一):00000000 00000000 00000000 00000010 //2. 得到3的补码===》得到3的补码前提是需要得到3的原码:00000000 00000000 00000000 00000011 // 得到3的补码(正数三码合一):00000000 00000000 00000000 00000011 //3. 计算: /** * 按位& * 00000000 00000000 00000000 00000010(2的补码) * 00000000 00000000 00000000 00000011(3的补码) * ———————————————————————————————————— * 00000000 00000000 00000000 00000010(运算后的补码) * * 由于结果最高位位为0,所以为正数(三码合一) * 运算后的原码也是:00000000 00000000 00000000 00000010 * 其结果转换为十进制:2 */ System.out.println(2 & 3);
- 案例2:按位取反,~-2推导过程
//1. 先得到2的原码:00000000 00000000 00000000 00000010 //2. 由于结果最高位位为0,所以为正数(三码合一),所以2的补码 // 2的补码=00000000 00000000 00000000 00000010 //3、~2操作: 11111111 11111111 11111111 11111101(运算后的补码) // 由于结果最高位位为1,所以为负数 // 需要先根据负数的补码-1得到负数的反码,然后负数的反码符号位不变,其他位取反即可得到原码 // 运算后负数的反码:负数的补码-1==》 11111111 11111111 11111111 11111100 //4、运算后的原码(反码符号位不变,其他位取反): 10000000 00000000 00000000 00000011 // 其结果转换为十进制为:-3 // 按位或、按位异或推导过程类似。 System.out.println(~2);
- 案例3:算术右移:>>;低位溢出(舍去),符号位不变,并用符号位补溢出的高位
//推导过程 //1的二进制:00000000 00000000 00000000 00000001 // ==>00000000 00000000 00000000 00000000 // 其本质:1/2/2 = 0; System.out.println(1>>2);
- 案例4:算术左移:<<;符号位不变,低位补 0
//推导过程 //1的二进制:00000000 00000000 00000000 00000001 // ==>00000000 00000000 00000000 00000010 //其本质:1*2*2 = 4; System.out.println(1<<2);
到此为止,关于位运算底层实现已介绍完毕,这一块真正的让你明白什么是原码、补码、反码。这样才能让你真正的明白Java底层计算逻辑的执行。

被折叠的 条评论
为什么被折叠?



