java位运算符和逻辑运算符理解
位运算符介绍
位移运算符是在二进制的基础上对数字进行平移。分为以下三种:
a<<b 左移 ( 格式:需要移动的数字 << 要移动的次数)
把a转换后的二进制所有数字向左移动b次,高位舍弃,低位的空位置补零。(int:32位[byte/short/char移位后自动变成int],long:64位)
在数字没有溢出,左移n位就相当于乘以2的n次方。若溢出,即超过32位则,取32的模数,33等于移位1次。
注意移位有可能变成负数:如图( 此处图片错误,应该是 3 << 30)
a>>b 右移
把a转换后的所有数字向右移动,低位舍弃,高位的空置补零。(正数补零,负数补1)
右移n位,相当于除以2的n次方。当余数为0或1时,不管右移多少值都是0。
a>>>b 无符号右移
把a转换后的所有数字向右移动,低位舍弃,高位的空置补零。(无论正负数都补零)
十进制转换二进制
将十进制除以2,余数记录保存,商继续除以2,直到商为零或一。记录的余数集合倒序排列,高位补零就是二进制。如图:
负整数转换二进制
先转换为二进制后,取反(将0变1,1变0,取反前注意补零),然后对取反后的二进制加一,注意这里是满2进1.示例:
二进制转换十进制
首先将二进制补齐,首位是0则为正数,是1则是负数。
负数二进制转换
将补齐后的二进制 减 1,然后取反,再同上计算。
逻辑运算符介绍
~ 按位非(NOT)(一元运算 格式: ~a)
将a的二进制取反,如:~3 ==》 二进制:11
==》 补零:00000000000000000000000000000011
==》 取反:11111111111111111111111111111100 (注意补零)
& 按位与(AND)(1100 & 0101)
两个运算符同时为1,则结果为1,其它都为0; 如:1100 & 0101 ==》0100
| 按位或(OR)
| 按位或(OR)
任何一个运算符为1,则结果为1,其它都为0; 如:1100 & 0101 ==》1101
^ 按位异或(XOR)
^ 按位异或(XOR)
两个运算符不一样时,则结果为1,其它都为0;如:1100 & 0101 ==》1001
&= 按位与赋值
|= 按位或赋值
^= 按位异或赋值
>>= 右移赋值
>>>= 右移赋值,左边空出的位以0填充
<<= 左移赋值
|= 按位或赋值
^= 按位异或赋值
>>= 右移赋值
>>>= 右移赋值,左边空出的位以0填充
<<= 左移赋值
扩展
boolean 1/8字节 = 1bit
byte 1字节 = 8bit
char 2字节 = 16bit = 一个汉字
short 2字节 = 16bit = 一个汉字
int 4字节 = 32bit
float 4字节 = 32bit
long 8字节 = 64bit
double 8字节 = 64bit
参考链接