Java Integer.highestOneBit(i)

一. 函数的作用:是取 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,即是负数的符号位)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值