java 位运算,移位运算,原码,反码,补码

1、机器数
数字在计算机中的二进制表示形式。
机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
如:10的二进制数是0 0001010
那么0 000 1010就是机器数。
2、真值
将带符号位的机器数对应的真正数值称为机器数的真值。
如:
0 1010的真值是+000 1010
1 1010的真值是-000 1010
3、原码、反码、补码的转换。
举例说明:10为例:
(1)、正数的原码、反码、补码都相同
0 000 1010
(2)、负数的原码 = 符号位 + |真值|。1加上 真值的绝对值。
-10的原码:
1 000 1010
(3)、-10的反码 = 符号位不变,其余各位取反
1 111 0101
(4)、-10的补码 = 反码+1
1 111 0110
注意:
在存储长度只有8位时,
-128的补码表示是1000 0000,-128并没有原码和反码表示。
原因:用-0的补码表示-128。
4、负数取模:a mod b = x - y *[x/y商的下界]
如:
-3 % 2
= -3 - 2 * [-3/2]
= -3 - 2 * [-1.5]
= -3 - 2 * (-2)
= -3 + 4 = 1
5、位运算——java
这里 -10 左移、右移、无符号右移 为例?
须知:
 a.机器都是使用补码,运算也是使用补码运算。
 b.正数的原码、反码、补码都相同。
(1)、左移 <<
 -10补码
 1 111 1111 1111 1111 1111 1111 1111 0110
 -10补码左移2位,如下
 1 111 1111 1111 1111 1111 1111 1101 1000
 转换成原码
 1 000 0000 0000 0000 0000 0000 0010 0111 (再求反)
 1 000 0000 0000 0000 0000 0000 0010 1000 = -40 (再求补,即原码)
(2)、右移 >>
 -10补码
 1 111 1111 1111 1111 1111 1111 1111 0110
 -10补码右移2位,如下
 1 111 1111 1111 1111 1111 1111 1111 1101
 转换成原码
 1 000 0000 0000 0000 0000 0000 0000 0010 (再求反)
 1 000 0000 0000 0000 0000 0000 0000 0011 = -3 (再求补,即原码)
(3)、无符号右移 >>>
 -10补码
 1 111 1111 1111 1111 1111 1111 1111 0110
 -10补码右移2位,如下
 0 011 1111 1111 1111 1111 1111 1111 1101 = 1073741821 (已经是一个正数了,即最终结果)
 小技巧:
左移n位就相当于乘以2的n次方。 
右移n位就相当于除以2的n次方。

6、java示例测试:

public static void main(String[] args) {

        // 10的原码、反码、补码 相同
        // 0 000 0000 0000 0000 0000 0000 0000 1010

        // -10的原码:符号位 + |真值|,1加上真值的绝对值
        // 1 000 0000 0000 0000 0000 0000 0000 1010

        // -10的反码:符号位不变,其余各位取反
        // 1 111 1111 1111 1111 1111 1111 1111 0101

        // -10的补码:反码+1
        // 1 111 1111 1111 1111 1111 1111 1111 0110

        //1010
        int a = 10;
        int n = 2;
        System.out.println(Integer.toBinaryString(a)+" <_"+a+"二进制(补)");
        System.out.println(Integer.toBinaryString(a>>n)+" <_右移"+n+"位-二进制(补)" );
        System.out.println((a>>n)+" <_右移"+n+"位-十进制" );
        System.out.println("\n--------------------------------------------------------\n");

        a = -10;

        //1、左移 <<
        // -10补码
        // 1 111 1111 1111 1111 1111 1111 1111 0110
        // -10补码左移2位,如下
        // 1 111 1111 1111 1111 1111 1111 1101 1000
        // 转换成原码
        // 1 000 0000 0000 0000 0000 0000 0010 0111 (再求反)
        // 1 000 0000 0000 0000 0000 0000 0010 1000 = -40 (再求补,即原码)
        System.out.println(Integer.toBinaryString(a)+" <_"+a+"二进制(补)");
        System.out.println(Integer.toBinaryString(a<<n)+" <_左移"+n+"位-二进制(补)" );
        System.out.println((a<<n)+" <_左移"+n+"位-十进制" );
        System.out.println("\n--------------------------------------------------------\n");

        //2、右移 >>
        // -10补码
        // 1 111 1111 1111 1111 1111 1111 1111 0110
        // -10补码右移2位,如下
        // 1 111 1111 1111 1111 1111 1111 1111 1101
        // 转换成原码
        // 1 000 0000 0000 0000 0000 0000 0000 0010 (再求反)
        // 1 000 0000 0000 0000 0000 0000 0000 0011 = -3 (再求补,即原码)
        System.out.println(Integer.toBinaryString(a)+" <_"+a+"二进制(补)");
        System.out.println(Integer.toBinaryString(a>>n)+" <_右移"+n+"位-二进制(补)" );
        System.out.println((a>>n)+" <_右移"+n+"位-十进制" );
        System.out.println("\n--------------------------------------------------------\n");

        //3、无符号右移 >>>
        // -10补码
        // 1 111 1111 1111 1111 1111 1111 1111 0110
        // -10补码右移2位,如下
        // 0 011 1111 1111 1111 1111 1111 1111 1101 = 1073741821 (已经是一个正数了)
        System.out.println(Integer.toBinaryString(a)+" <_"+a+"二进制(补)");
        System.out.println(Integer.toBinaryString(a>>>n)+" <_无符号右移"+n+"位-二进制(补)" );
        System.out.println((a>>>n)+" <_无符号右移"+n+"位-十进制" );
        System.out.println("\n--------------------------------------------------------\n");
    }

运行示例结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值