java 位运算 取反_JAVA位运算之按位取反

一直纠结于位运算中的 按位取反 以及原码、反码、补码之间的各种关系,反正各种混淆各种懵逼。经过一小段时间才弄明白这个别人觉得很容易的问题。可能还是我基础不太好。

位运算是对操作数以二进制为单位的进行的运算,位运算符则用于位运算。位运算符包括&(按位与)、|(按位或)、^(按位异或)、~(按位取反)等等…位运算符操作数可以是整型或字符型,结果为整型。

按位取反是对补码进行运算,当运算完后,再将补码变回原码。

~ 这个符号为按位取反运算符。按位取反的运算规则为0变成1,1变成0. [0->1,1->0]

有这么一个题:1.求~9的结果是什么

解:9的二进制数表示 0000 1001

9的原码 0000 1001

9的反码 0000 1001

9的补码 0000 1001

按位取反操作 1111 0110

变为原码先减一 1111 0101

再取反 1000 1010 (-10)

2.求~-9的结果

-9的二进制数表示 1000 1001

-9的原码 1000 1001

-9的反码 1111 0110

-9的补码 1111 0111

按位取反操作 0000 1000

变为原码 0000 1000 (8) 因为正数的补码、反码、原码都是一个样。

假如9的类型是char型,char类型占一个字节,一个字节等于八位二进制数,所以它的数据宽度为八位二进制数(0000 0000)。最高位,也就是最左边的0为符号位:0表示正数,1表示负数。

9用二进制数存储在内存中为:0000 1001 (原码)这就是原码

而9为正数,它的原码、反码、补码都是同一个,都是 0000 1001

按位取反时,需要对所有的二进制数取反。 按位取反后变成 1111 0110 此时的二进制数为补码,而且是负数(因为最高位为1,表示为负数),就需要将其变为原码,补码变为原码,怎么变呢,首先先减1,此时变为 1111 0101,然后再变为原码(变为原码时,符号位不变)1000 1010(原码),此时的原码就是这个,它就是-10.所以~9=-10.

说一说原码、反码、补码。

-5,若数据宽度为8位。

-5的原码用二进制数表示是 1000 0101

反码就是除符号位,其余位数,将0变成1,将1变成0.

5的反码: 1111 1010

补码就是将0变成1,1变成0后再加1.

5的补码: 1111 1011

而正数的原码、反码、补码都是本身

5的原码 0000 0101

5的反码 0000 0101

5的补码 0000 0101

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值