• java 移位运算


      移位运算 :将整数转化为二进制(以补码的形式),按位平移。

        <<     左移

        >>     右移

        >>>   无符号右移

      << 右移:

        按位做平移,末位用0补上(正负数都一样) 

        a << n; 

        如果 a 是  byte、short、int 类型 那么 a << n 就是  a << (n%32)

          int a = 5;

          System.out.println(a<<3);     //输出 40

          System.out.println(a<<35);   //输出 40

        如果 a 是  long 类型  那么 a << n 就是  a << (n%64)

          long a = 5;

          System.out.println(a<<3);     //输出 40

          System.out.println(a<<35);   //输出 171798691840

          System.out.println(a<<67);  //输出 40

         注意 :由于这只是按位平移,有可能符号化会改变

          int a = 1;

          a<<=31;

          System.out.println(a);    //输出 -2147483648

          System.out.println(Integer.toBinaryString(a));    //输出 1000 0000 0000 0000 0000 0000 0000 0000

          由于最高位是1所以是一个负数

      >> 右移:

        按位做平移

        如果 a 是  byte、short、int 类型 那么 a >> n 就是  a >> (n%32)

          int a = 40;

          System.out.println(a>>3);     //输出 5

          System.out.println(a>>35);   //输出 5

        如果 a 是  long 类型  那么 a >>n 就是  a >> (n%64)

          long a = 40;

          System.out.println(a>>3);     //输出 5

          System.out.println(a>>35);   //输出 0

          System.out.println(a>>67);  //输出 5

        注意 :  正数右移,前补位0(正数往右移,最小为0)

              System.out.println(40>>31);   //输出 0

              System.out.println(Integer.toBinaryString(40>>31));  //输出 0

            负数右移,前补位1(负数往右移,最大为-1) 

              System.out.println(-40>>31);   //输出 -1

              System.out.println(Integer.toBinaryString(-40>>31));  //输出  1111 1111 1111 1111 1111 1111 1111 1111

           负数右移,并不仅仅是除以2

              System.out.println(-5>>1);     //输出 -3

              System.out.println(Integer.toBinaryString(-5));    //输出 1111 1111 1111 1111 1111 1111 1111 1011

              System.out.println(Integer.toBinaryString(-5>>1));   //输出 1111 1111 1111 1111 1111 1111 1111 1101

      

      >>>无符号右移: 

        按位做平移,前补位用0(正负数都一样)

        如果 a 是  byte、short、int 类型 那么 a >>> n 就是  a >>> (n%32)

          int a = 40;

          System.out.println(a>>>3);     //输出 5

          System.out.println(a>>>35);   //输出 5

        如果 a 是  long 类型  那么 a >>> n 就是  a >>> (n%64)

          long a = 40;

          System.out.println(a>>>3);     //输出 5

          System.out.println(a>>>35);   //输出 0

          System.out.println(a>>>67);  //输出 5

       

  • 相关阅读:
    821. 字符的最短距离
    1122. 数组的相对排序
    258. 各位相加
    C++常见问题之二#define使用中的陷阱
    python进阶二_基本数据类型与操作
    DirectX10一变换(三)
    Android中编译工具链的改动----LLVM份量的增加
    DirectX10一矩阵代数(二)
    DirectX10一向量代数(一)
    基于asp.net + easyui框架,一步步学习easyui-datagrid——实现添加、编辑、删除(三)
  • 原文地址:https://www.cnblogs.com/lkcc/p/6280462.html
Copyright © 2020-2023  润新知