位运算的详解
1.1位运算符概述
1.位运算概念: 位运算符主要按位对每个二进制位(bit)进行运算,其操作数和运算结果都是整数型.即只能对 byte,short,char,int,long 进行运算.
2.Java语言中位运算分为:位逻辑运算符和位移运算符两类.
3.在java当中,可以把二进制的1认为是true,0认为是false,从右到左,对其数位进行逻辑运算即可。
符号 | 名称 | 基本用法 | 案例 |
---|---|---|---|
& | 与 | 按位进行与运算(AND) | 4&5 结果4 |
| | 或 | 按位进行或运算(OR) | 4|5结果5 |
~ | 非(取反) | 按位进行取反运算(NOT) | ~4结果-5 |
^ | 异或 | 按位进行异或运算(XOR) | 4^5结果1 |
<< | 左位移 | 按位左移,数值扩大2的倍数 | 10<<1结果20 |
>> | 右位移 | 按位右移,数值缩小2的倍数 | 10>>2结果2 |
>>> | 无符号右移 | 只针对正数按位右移,数值缩小2的倍数 | 20>>1结果10 |
4 & 5 = 4
& 全真则真 有假则假 有0则0 全1则1
运算的是补码
0000 0100
0000 0101
____________
0000 0100
1.2位逻辑运算
1.按位与&:补码按位逐位相与,全1则1,有0则0
1)参与运算的数字,低位对齐,高位不足的补0
2)对应的二进制位同时为1, 计算结果为1,否则为0
3)任何数与0进行按位运算,其结果都为0
举例:4 & 5
100
101
100 结果4
案例1:int x = 5,y = 12;
int z = x & y;
案例2: 根据ip地址和子网掩码计算网络地址
(在dos命令行下,使用【ipconfig】命令可以查看本机ip地址和子网掩码信息)
计算方式:进行ipv4地址和子网掩码的转换为2进制,然后做与运算。
案例2: 解析过程
1.IPv4地址中的网段转换成二进制
2.子网掩码中的网段转换成二进制
3.进行&运算,全1则1,否则为0,得到的运算结果 : 10.10.77.0
2.按位或|: 补码按位逐位相或,全0则0,有1则1
1)参与运算的数字,低位对齐,高位不足的补0
2)对应的二进制位只要有一个为1, 结果为1
3)对应的二进制位都为0, 结果为0
案例1 : 11|7
3.按位异或^:补码按位逐位异或,相同为0,不同为1
1)参与运算的数字,低位对齐,高位不足的补0
2)对应的二进制位相同(同时为0或同时为1)时,结果为0
3)对应的二进制位不相同,结果为1
案例1: 11^7
4.按位取反~: 对一个操作数进行运算,补码按位逐位取反,1变0,0变1
注意: ~是个单目运算符,只有一个操作数
案例1 : ~10
上图的结果不对
因为计算结果的补码是个负数,需要转换成原码计算其结果,转换过程:减一再取反或者取反加一
原码结果为: 10000000 00001011, 实际结果-11
~10
补码 0000 1010
取反后的补码 1111 0101
转换为源码: 1000 1011
1.3位移运算
1.位移运算:操作数向某个方向(向左或向右)移动指定的二进制位数,运算效率高.
2. <<:按位左移:补码按位左移,高位移出(舍弃),最低位补零,移动一位扩大二倍.
注意事项:左移会造成最高位数据溢出,导致结果错误.
案例1: 11<<1
3.>>按位右移:补码按位右移,最高位补符号位,低位移出(舍弃),移动一位缩小为原来的二分之一
注意事项:
1)正数右移得到结果和除法一致
2)负数右移得到结果和除法不一致,运算过程为将负数转换成对应的补码,右移,移动时高位补1,将移动后的补码结果转换成原码,得到最终结果
案例1:
计算11>>1
4.>>>无符号按位右移:补码按位右移,最高位补零,最终正数运算完成之后缩小为原来的二分之一.
注意事项:
1)负数不能无符号右移
2)正数无符号右移效率高于普通按位右移
案例1: 计算10>>>1和-10>>>1