Java按位取反操作~

1、前言

计算机存储的整型数据是存储的2进制,而此2进制并不是此10进制数直接对应的2进制数(原码),而是存储的此2进制数的补码。
所以,取反(~)是对补码的按位取反操作,而要从原码转换成补码,必须要先从原码转换成反码,再从反码转换成补码才可以。

注意:2进制的最高位是符号位(在最左侧)

2、看两个例子 :

问题1: ~0的值是多少?

    以正整数 0(10进制)为例,要得到~0的结果,操作步骤如下 :
    原码 0000 0000 把10进制数转换成8位的2进制数
    反码 0000 0000 正数的反码是原码
    补码 0000 0000 正数的补码也是原码

    按位取反得到新补码 1111 1111 将补码按位取反,注意此时最高位从0变成了1,即已变成负数
    新反码 1111 1110 再将[按位取反]后的新补码,转换成新反码,注意非常关键的一个变换过程:现在是将负数从补码转反码;那么需要将补码的最低位-1,同时符号位(1表示负,0表示正)要保持固定不变
    新原码 1000 0001 再将新反码转新原码,注意是负数,符号位要固定不变,最后得到结果就是 -1 ,到此分析完毕。

问题2: ~-1的值是多少?

    负整数-1(10进制)为例 ,要得到~-1的结果,操作步骤如下 :
    原码 1000 0001 把10进制数转换成8位的2进制数
    反码 1111 1110 负数的反码是,符号位(1表示负,0表示正)固定不变,其他位按位取反(通俗来讲就是把0变成1,1变成0)
    补码 1111 1111 负数的补码是,符号位(1表示负,0表示正)固定不变,但是要在反码的最低位+1(最右侧+1)

    按位取反得到新补码 0000 0000 按位取反后的补码(此步骤核心就是对应,这个操作符~ 的操作),我们需要将补码转换成反码,在转换成原码,最后转换成10进制数结果
    注意上面[按位取反]步骤执行后,最高位从1变成了0,即已变成正数,后续我们要按照正数的反码、补码来进行操作
    新反码 0000 0000 正数的反码与补码、原码是相同的
    新原码 0000 0000 正数的反码与补码、原码是相同的
    获取10进制数结果,就是0,到此分析完毕

问题3: ~1的值是多少?

    以正整数 1(10进制)为例,要得到~0的结果,操作步骤如下 :
    原码 0000 0001 把10进制数转换成8位的2进制数
    反码 0000 0001 正数的反码是原码
    补码 0000 0001 正数的补码也是原码

    按位取反得到新补码 1111 1110 将补码按位取反,注意此时最高位从0变成了1,即已变成负数
    新反码 1111 1101 再将[按位取反]后的新补码,转换成新反码,注意非常关键的一个变换过程:现在是将负数从补码转反码;那么需要将补码的最低位-1,同时符号位(1表示负,0表示正)要保持固定不变
    新原码 1000 0010 再将新反码转新原码,注意是负数,符号位要固定不变,最后得到结果就是 -2 ,到此分析完毕。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值