进制
我们都知道计算机使用的是二进制运算。以byte为例,8位能表达的范围从(00000000)2~(11111111)2,转成十进制就是0~255,但由于还有负数的存在,byte实际表达的范围是-128~127。在计算机里,对于有符号的数据类型,会把最高位做为符号位,如果为1,则为负数。负数通常有三种表达方式,原码,反码与补码。
原码:把符号位设为1。如11的二进制是00001011,-11就是10001011。
反码:所有数字取反。-11是11110100。
补码:在反码的基础上加1。-11是11110101。使用补码的好处包括,0和-0的表示相同,正负数可以直接进行加减法运算。现代计算机都是使用补码来表示负数。
二进制正负转换快速算法:最右边的1不变,前面几位取反。
对byte进行运算时,会将byte转换为int再进行运算,因此要注意byte的取值范围,超出范围的话会出现错误的结果。如:
byte x=(byte)128;
此时的x输出为-128
位运算符
&:按位与。
|:按位或。
~:按位非。
^:按位异或。(又称半加法运算,相加取后一位,如1+1=10,取0)
<<:左位移运算符。
>>:右位移运算符。
>>>:无符号右移运算符。
一般而言左位移n位就是乘以2的n次方,右位移n位就是除以2的n次方。但是负数的右位移n位是除以2的n次方再减一。如,
int n=-11;
int c=n<<2;
int d=n>>1;
此时c=-44,d=-6。
>>是带符号的位移
正数则高位补0,负数则高位补1。
>>>是无符号的位移
始终补0
以byte位例
11的二进制00001011,右位移两位,00000010。2
-11的二进制11110101,右位移两位,11111101。-3
-11无符号右移两位,00111101。61