1、Java运算符大致分为
逻辑运算符(&& , || , !)、
算数运算符(+ , - , * , / , +=)、
位运算符(^ , | , &)、
其他运算符(三元运算符)
编码utf-8:
1个英文字符(包括数字、字母、英文特殊字符):1个字节,2个hex,8个bit。
1个汉字(包括汉字、中文特殊字符):3个字节,6个hex,24个bit。
1个字节:8个bit位,2个16进制。
1个16进制:4个bit位。
八位(8bit)是一个字节,计算机中只要一个字节就可以存放ASCII编码,就是所有的数字、大小写字母和一些特殊字符(总共255个)。所以在计算机中对用户来说有意义的单位就是字节,这是我们可以看懂的。
八位的二进制数最大值就是255,刚好表示255个ASCII字符。
我们汉字使用的是unicode编码的,unicode编码要用两个字节,所以要存放16位二进制数才能代表一个unicode字符。
1、位运算符
① &(按位与)
& 按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0 。如:
3的二进制位是0000 0011 , 5的二进制位是0000 0101 , 那么就是011 & 101,由按位与运算规则得知,001 & 101等于0000 0001,最终值为1
7的二进制位是0000 0111,那就是111 & 101等于101,也就是0000 0101,故值为5.
② |(按位或)
| 按位或和 & 按位与计算方式都是转换二进制再计算,不同的是运算规则(一个为真即为真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1,如:
6的二进制位0000 0110 , 2的二进制位0000 0010 , 110|010为110,最终值0000 0110,故6|2等于6。
③ ^(异或运算符)
^ 异或运算符顾名思义,异就是不同,其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
5的二进制位是0000 0101 , 9的二进制位是0000 1001,也就是0101 ^ 1001,结果为1100 , 00001100的十进制位是12。
④ <<(左移运算符)
5<<2的意思为5的二进制位往左挪两位,右边补0,5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等于乘于2的n次方,十进制位是20。
⑤ >>(右移运算符)
凡位运算符都是把值先转换成二进制再进行后续的处理,5的二进制位是0000 0101,右移两位就是把101右移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1。
⑥ ~(取反运算符)
取反就是1为0,0为1。
5的二进制位是0000 0101,取反后为1111 1010,值为-6 。
⑦ >>>(无符号右移运算符)
- 正数无符号右移
无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。
15的二进制位是0000 1111 , 右移2位0000 0011,结果为3。
- 负数无符号右移
-6的二进制是6的二进制取反再加1,6的二进制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1为1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111
至于这个负数的无符号右移为什么是4个字节位的移动,因为:int值占位4个字节,上面的位运算为了方便书写,才写成了8bit位。实际int值有32bit。