美文网首页
>>、<<、>>>位移操作

>>、<<、>>>位移操作

作者: 迷糊小生 | 来源:发表于2019-04-04 07:20 被阅读0次

1、左移运算符<<

<<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。

1.为正数情况

public class DemoTest {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("十进制:" + num + ", 二进制:" + Integer.toBinaryString(num));
        int newnum = num << 2;
        System.out.println("左移2位后十进制:" + newnum + ", 左移2位后二进制:" + Integer.toBinaryString(newnum));    //正整数x左移n位后的十进制结果,x = x * 2^n
    }
}
image.png

2.为负数的情况

public class DemoTest {
    public static void main(String[] args) {
        int num = -10;
        System.out.println("十进制:" + num + ", 二进制:" + Integer.toBinaryString(num));
        int newnum = num << 2;
        System.out.println("左移2位后十进制:" + newnum + ", 左移2位后二进制:" + Integer.toBinaryString(newnum));    //正整数x左移n位后的十进制结果,x = x * 2^n
    }
}
image.png

为什么会-10的二进制会出现这么多的1呢?仔细数一下刚好有32位。首先需要了解的是Java负数存储是以补码形式存储的(补码=反码+1),10的二进制是1010,它的反码就是0101,再加1就是补码0110。那为什么会多出来那么多1呢?这是因为int型在Java中占8个字节,刚好32位,10原码的高位全是0,它的反码自然高位就变成了1。所以整体左移2位,低位以0补齐,最后的运算结果就是x = (|x| + 2^n)。

2、右移运算符>>

>>有符号右移位,将运算数的二进制整体右移指定位数,整数高位用0补齐,负数高位用1补齐(保持负数符号不变)。

1.为正数情况

public class DemoTest {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("十进制:" + num + ", 二进制:" + Integer.toBinaryString(num));
        int newnum = num >> 2;
        System.out.println("右移2位后十进制:" + newnum + ", 右移2位后二进制:" + Integer.toBinaryString(newnum));    //右移n位后的运算数x十进制结果,x = x / 2
    }
}
image.png

2.为负数的情况

public class DemoTest {
    public static void main(String[] args) {
        int num = -10;
        System.out.println("十进制:" + num + ", 二进制:" + Integer.toBinaryString(num));
        int newnum = num >> 2;
        System.out.println("右移2位后十进制:" + newnum + ", 右移2位后二进制:" + Integer.toBinaryString(newnum));    //右移n位后的运算数x十进制结果,x = x / 2
    }
}
image.png

负数的有符号右移基本原理还是和左移相同,不同的是结果的计算,因为这是有符号的右移,一直右移最后的结果就会是-1。归纳起来就是,如果运算数是偶数,那么它的运算结果就是 x = -(|x| / 2),如果运算数是奇数,那么它的运算结果就是 x = -(|x| / 2) - 1。

>>>,无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)

1.为正数情况

public class DemoTest {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("十进制:" + num + ", 二进制:" + Integer.toBinaryString(num));
        int newnum = num >>> 2;
        System.out.println("右移2位后十进制:" + newnum + ", 右移2位后二进制" + Integer.toBinaryString(newnum)); // 右移n位后的云算数x十进制结果,x
    }
}
image.png

正数的>>>无符号右移位和>>有符号右移位计算结果相同

2.为负数的情况

public class DemoTest {
    public static void main(String[] args) {
        int num = -10;
        System.out.println("十进制:" + num + ", 二进制:" + Integer.toBinaryString(num));
        int newnum = num >>> 2;
        System.out.println("右移2位后十进制:" + newnum + ", 右移2位后二进制" + Integer.toBinaryString(newnum)); // 右移n位后的云算数x十进制结果,x
    }
}
image.png

虽然无符号移位后的二进制和有符号移位后的二进制看起来相同的,但结果大相径庭,记住有符号右移位操作,实际上是忽略符号的算术操作,即高位统一补0。

相关文章

  • >>、<<、>>>位移操作

    1、左移运算符<< <<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。 1.为正数情况 2.为负...

  • 位移操作

    基础: << : 左移运算符,num << 1,相当于num乘以2 >> : ...

  • 进制: 位移操作

    源码: shifting.py 测试: main.py

  • java位移操作

    十进制、二进制 十进制数在计算机中的表示方法,对于正数和负数是不一样的。负数:绝对值对应的二进制,取反码,将反码加...

  • java位移操作

    用移位操作可以极大地提高性能,对于乘除2^n(n为正整数)的正整数计算,可以用移位操作来代替。 int num1 ...

  • 位操作

    位操作详解 位运算的操作符有:&、|、^、~、>>、<<,六种,分别对应与,或,异或,按位取反,右位移,左位移 1...

  • PQ列表位移操作

    案例下载:http://pan.baidu.com/s/1jI9dFEI 密码:g543 今天遇到一个需求,需要实...

  • 位移操作枚举定义

    枚举的定义还支持位运算的方式定义,如下: 等于号后面必须等于1 什么时候要用到这种方式呢? 那就是一个枚举变量可能...

  • java位运算

    位运算符主要有3个:有符号右位移>>,有符号左位移<<,无符号右位移>>>,位运算的操作的对象是二进制的位,通过位...

  • 画布操作

    所有的画布操作都只影响后续的绘制,对之前已经绘制过的内容没有影响 位移translate方法 位移是基于当前位置移...

网友评论

      本文标题:>>、<<、>>>位移操作

      本文链接:https://www.haomeiwen.com/subject/nluxiqtx.html