一、原码、反码、补码相互转换
正整数的原码、补码、反码都一样,第一位为符号位,为0,余下七位为二进制形式。
下面主要讲解负整数三码的转换
1、原码——>反码:符号位不变,数值位分别按位取反。
eg. X= -1101001
X原=11101001
X反=10010110
2、反码——>原码:也是按位取反,如上。
3、原码——>补码:符号位不变,数值位按位取反,末位再加1,即反码末位加1
eg. X= -1101001
X原=11101001
X反=10010110
X补=10010111
4、补码——>原码:符号位不变,数值位按位取反,末位加1。即补码的补码等于原码
eg. X补=11101100
X原=10010100
5、补码转为原码的负数的补码:符号位和数值位都取反,末位再加1
eg. X补=01010110
-X补=10101010
二、运算符
1、JAVA的运算符,分为四类
算数运算符:+ - * / % ++ --
关系运算符:== != > >= < <=
逻辑运算符:&& || ! ^ & |
位运算符:& | ~ ^ >> << >>>;
2、逻辑运算符
逻辑与 '&&',逻辑或 '||',逻辑非 '!',逻辑异或 '^',逻辑与 '&',逻辑或 '|'
逻辑运算符要求操作数的数据类型为逻辑型,其运算结果也是逻辑型值。逻辑运算的数据和逻辑运算符的运算结果是boolean类型。
两种逻辑与(&&和&)和 两种逻辑或(||和|)的区别
&和|运算是把逻辑表达式全部计算完,而&&和||运算具有短路计算功能
3、位运算符
位运算是将数据先转化为二进制数补码形式,再逐位(bit)按规则计算
& :按位与(全1为1,否则为0)
| :按位或(全0位0,否则为1)
~ :按位取反(有1则0,有0则1)
^ : 按位异或(相同为0,不同为1)
4、移位运算符
<< 算术左移,我们会把最高位溢出,即舍掉,最低位补零
>> 算术右移, 如果最高位是1,那么高位就要补1,低位舍掉;如果高位时0,那么高位就补0,低位舍掉
>>> 逻辑右移,就是不考虑符号位,直接右移,高位补零,低位舍掉
算术左移和算术右移主要用来进行有符号位的倍增、倍减
逻辑左移和逻辑右移主要用来进行无符号位的倍增、倍减
例1:
注意:计算机运算的时候,都是以补码的方式来运算的,如果补码计算结果负数,则需要把补码转为原码
1>>2
1的原码
00000000 00000000 00000000 00000001
因为正数的原码、反码、补码都一样
所以1的补码
00000000 00000000 00000000 00000001
算数右移2位结果
00000000 00000000 00000000 00000000
所以1>>2=0
推导出1>>n(n>1的正整数) 结果都为0
例2:
-1>>2
-1的原码
10000000 00000000 00000000 00000001
-1的反码
11111111 11111111 11111111 11111110
-1的补码
11111111 11111111 11111111 11111111
算数右移2位结果
11111111 11111111 11111111 11111111
补码->反码 :-1
11111111 11111111 11111111 11111110
反码->原码
10000000 00000000 00000000 00000001
所以-1>>2=-1
推导出-1>>n(n>1的正整数) 结果都为-1
例3:
3>>>2
3的原码
00000000 00000000 00000000 00000011
因为正数的原码、反码、补码都一样
所以3的补码
00000000 00000000 00000000 00000011
>>>逻辑右移2位结果为
00000000 00000000 00000000 00000000
所以3>>>2=0