算数运算符 (+ - * / % ++ --)
赋值运算符(+= -= *= /= %=)
关系运算符(== != >= <= > <)
逻辑运算符(&& & || | ! ^)
位运算符(>> << >>> & | ^)
位运算符是不大好理解的一类
在位运算符之前需要将进行位运算符的两边进行进制转换 因为位运算需要在二进制中进行,而且既然提到了位这个概念,就得理解什么是位.
随便举一个数字 23 将找一个十位数转成二进制的方法是找与之相近的2的幂次方 16+4+2+1 转换为2进制就是00010111
但是这时候就得了解一下各种数据类型所占的位数:java的8种基本数据类型:整型类型:byte short int long 字符类型:char 布尔类型:boolean.
byte是一个字节,short是两个字节,int是4个字节,long是八个字节,一个字节占8位.所以 byte是8位,short是16位,int32位,long64位
char占两个字节 boolean类型只有true和false具体占几个字节我觉得也就1/8个字节一个bit.
了解了这些 那么现在就开始进行一下位运算
首先是左移运算符"<<":
我先假设我写的数是-127~128之间的byte类型 如 23转换为二进制是 00010111
将 00010111左移一位看看是什么样子 00010111
00010111 现在我们将空位补上0 将最左边的那个0舍去 就完成了左移的操作
00101110 那么现在这个数转换为十进制 就成了2+4+8+32=46 而46恰恰是23的两倍
所以左移一位其实就相当于原来的数字乘以2 右移">>"与之同理
00010111
00010111 现在我们将空位补上0 将最右边的那个1舍去 就完成了右移的操作
00001011 那么将现在这个数转换为十进制 1+2+8=11 因为byte所以将小数点后省去
所以右移一位相当于原来的数字除以2
左移和右移都比乘法和除法更有效率 因为移位耗费的是两个机器周期 而乘除都是四个机器周期
然后在讨论一下负数的情况 在计算机组成原理课上讲过 在计算机中 我们都是以补码的形式进行计算 正数的原码 反码 补码都是一样的 在二进制中 一串数字的第一位表示的是这个数字的正负 比如举个例子:+7的二进制为00000111 -7的二进制为10000111
现在将-24这个数的原码 反码 补码来写一下 原码:10011000
反码: 11100111 //也就是符号位不变 其余位取反0变1 1变0
补码: 11101000 //也就是在反码的基础上 +1
将-24右移两位 11101000
11111010(00) 高位补了2个1低位舍了两个0
11111001 减一
10000110 符号位不变 其余各位取反 10000110的十进制 是 -6
如果是无符号移位 >>> 输出的数字就是无符号数 1073741818