进制与位运算(一)

来源:互联网 发布:偷窥网络在线视频 编辑:程序博客网 时间:2024/06/07 18:24

进制

我们都知道计算机使用的是二进制运算。以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
       

0 0