您的位置:首页 > 编程语言 > Java开发

关于java位运算

2015-03-19 12:17 134 查看
 1、     首先要知道符号数的二进制表现形式,在计算机中有三种表示方法,正整数是使用2的原码来表示,负整数是使用2的补码来表示。

而且在二进制里面最高位是用于表示符号位的,1为负,0为正,比如byte类型用8位来表示,其中最高位用于符号位,剩下的用于表示数值!

具体的转换过程就是补码=反码+1,反码等于原码取反(符号位不变)

举个例子:

       8表示成二进制的形式是:0000 1000:;

       -8表现成二进制的形式是:1111 1110 ;

具体是怎样转换的呢?首先把0000 1000取反得到反码就是1111 0111,然后加1得到补码就是1111 1000;

至于为什么要使用2的补码的方式来表示负数可以参考下面的网址:

http://www.ruanyifeng.com/blog/2009/08/twos_complement.html

2、    下面介绍Java的一些数值类型转换规则

       2.1、如果最初的数值类型是有符号的(分正负),那就执行符号扩展

       2.2、如果是不带符号类型的(如char型),那就执行0扩展

       2.3、如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度,比如将int型转成byte型就直接截取int型的右边8位!

3、什么是符号扩展(Sign extension)

      用于在数值类型转换时扩展二进制位的长度,以保证转换后的数值和原数值的符号(正或负)和大小相同,一般用于较窄的类型

(如byte)向较宽的类型(如int)转换。扩展二进制位长度指的是,在原数值的二进制位左边补齐若干个符号位(0表示正,1表示负)。

    举例来说,如果用6个bit表示十进制数10,二进制码为"00 1010",如果将它进行符号扩展为16bits长度,结果是"0000 0000 0000 1010",

即在左边补上10个0(因为10是正数,符号为0),符号扩展前后数值的大小和符号都保持不变;如果用10bits表示十进制数-15,使用“2的补码

”编码后,二进制码为"11 1111 0001",如果将它进行符号扩展为16bits,结果是"1111 1111 1111 0001",即在左边补上6个1(因为-15是负数,符号为1),

符号扩展前后数值的大小和符号都保持不变。

4、什么是0扩展:

   如果用6个bit表示十进制数10,二进制码为"00 1010",如果将它进行0扩展为16bits长度,结果是"0000 0000 0000 1010",

 即在左边补上10个0(因为10是正数,符号为0)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: