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

Java Integer.highestOneBit(i)

2018-01-03 17:07 162 查看
一. 函数的作用:是取 i 这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。

返回结果分三种情况:

1.如果一个数是0, 则返回0;

2.如果是负数, 则返回 -2147483648:

10000000,00000000,00000000,00000000(二进制表示的数);

3.如果是正数, 返回的则是跟它最靠近的比它小的2的N次方。

二. 引用知识

在计算机系统中,数值一律使用补码来表示和存储。主要原因是使用补码可以将符号位和其它位统一处理;同时,减法也可按照加法来处理。另 外, 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

数值的补码表示(分两种)

- 正数的补码:与原码相同

- 负数的补码:符号位位1,其余位位该数绝对值的原码按位取反;然后整个数加1。

- 已知一个数的补码,求原码的操作分为两种情况
- 如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位位1,其余各位取反,然后整个数加1。
- 如果补码的符号位“0”,表示是一个正数,所以补码就是该数的原码。


移位运算符就是在二进制的基础上对数字进行平移。Java按照平移的方向和填充数字的规则分为三种:左移<<,带符号右移 >>和无符号右移>>>。

(1)<<运算规则:按二进制形式吧所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

语法格式:需要移位的数字<<移位的次数

例:2<<2

Java中一个int数占四个字节,那么2的二进制数字为00000000 00000000 00000000 00000010,然后把该数字左移两位。其它的数字都朝右平移两位,最后在低位(右侧)的两个空位补零。则得到的最终结果是00000000 00000000 00000000 00001000,即转换为十进制数8。

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方; 在溢出的前提前,则不符合这个规律。

(2)>>运算规则:按二进制形式吧所有的数字都向右移动对应的位置,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。

语法格式:需要移位的数字>>移位的次数

例: 2>>1

Java中一个int数占四个字节,同样2的二进制为00000000 00000000 00000000 00000010,然后把该数字右移一位。最后在高位补符号位(该数是正数,全补零),得到的结果是00000000 00000000 00000000 00000001,即使十进制的1。数学意义就是右移移位相当于除2,右移n位相当于除以2的n次方。

例:-2>>1

由于负数在计算机中是以补码的形式存储的,那么-2的二进制为11111111 11111111 11111111 11111110,然后把该数字右移一位,最后在高位补符号位(该数是负数,全补1),得到的结果是11111111 11111111 11111111 11111111(补码格式),即是十进制的-1。

(3)>>>运算规则:按二进制形式吧所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。正数运算结果与带符号右移相同,对于负数来说则不同。

三. 源码



1、第一步的作用是把最高位1右移移位,并与原数据按位取或。那么这就使得最高位和它的下一位是连续两个1。

2、第二步的作用是把刚刚移位得到连续两个1继续右移两位并与原数据按位取或。那么这就使得最高两位和它的下两个连续位组成四个连续的1。

3、 以此类推,最终得到的i是从开始的最高位到结束全是1。并减去i不带符号的右移一位,即可得到一个int数据的最高位的值。

4、上述情况是针对于i不为零和负数的情况,如果i为零,那么得到的结果始终为零。如果i位负数,那么得到的结果始终是-2147483648。即等于Integer.MIN_VALUE。(原因在于负数的最高位始终为1,即是负数的符号位)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 二进制 计算机