进制与位运算(一)

xiaoxiao2021-02-27  157

进制

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

         

转载请注明原文地址: https://www.6miu.com/read-12825.html

最新回复(0)