精华内容
下载资源
问答
  • Java位移操作

    千次阅读 2018-07-19 11:13:58
    对于Java位移操作,有三种 左移(<<),规则 : 低位始终补0 右移(>>),规则: 正数符号位补0,负数符号位补1(符号位为最高位,0-正数,1-负数) 无符号右移(>>&...

        对于Java位移操作,有三种

    1. 左移(<<),规则 : 低位始终补0
    2. 右移(>>),规则:  正数符号位补0,负数符号位补1(符号位为最高位,0-正数,1-负数)
    3. 无符号右移(>>>),规则:符号位(最高位)始终补0

         下面直接上一段代码:

    @Test
    public void testWeiYi(){
    
        //右移比较简单
    	System.out.println(1L >> 1);
    	System.out.println(1L >> 65);
    	System.out.println(1L >>> 1);
    	System.out.println(1L >>> 65);
    
    	//long型
    	System.out.println("long 左移");
    	System.out.println(1L << 1);
    	System.out.println(1L << 65);
    
    	//int型
    	System.out.println("int 左移");
    	System.out.println(1 << 1);
    	System.out.println(1 << 33);
    	System.out.println(1 << 65);
    
    	//short型
    	System.out.println("short 左移");
    	System.out.println((short)((short)1 << 1));
    	System.out.println((short)((short)1 << 17));
    	System.out.println((short)((short)1 << 33));
    	System.out.println((short)((short)1 << 65));
    
    	//byte型
    	System.out.println("byte 左移");
    	System.out.println((byte)((byte)1 << 1));
    	System.out.println((byte)((byte)1 << 9));
    	System.out.println((byte)((byte)1 << 17));
    	System.out.println((byte)((byte)1 << 33));
    	System.out.println((byte)((byte)1 << 65));
    
    }

    运行结果:

     

    有没有发现,左移竟然是循环移动的,不过对于byte,short,int都是转成int后,再循环移动

    下面总结一下:

    1. 左移(<<),规则 : 低位始终补0, 左移是循环移动
    2. 右移(>>),规则:  正数符号位补0,负数符号位补1(符号位为最高位,0-正数,1-负数)   右移不是循环移动
    3. 无符号右移(>>>),规则:符号位(最高位)始终补0     右移不是循环移动
    4. 对于byte,short,int都是转成int后,再进行位移操作

     

    展开全文
  • Java位移运算符

    2018-04-08 11:17:49
    Java位移运算符 Java位移运算符分为两大类: 左移 右移 x = x &lt;&lt; n 左移运算是将二进制位串向左移动n位,低位补0,而左移运算符号没有带符号和不带符号的概念。 右移运算是将二进制位串向右...

    Java位移运算符

    Java位移运算符分为两大类:

    • 左移
    • 右移
    x = x << n

    左移运算是将二进制位串向左移动n位,低位补0,而左移运算符号没有带符号和不带符号的概念。

    右移运算是将二进制位串向右移动n位,右移运算符有带符号和不带符号的概念:

    • 带符号右移:>> ,保留最高位(符号位),其余的高位补0,带符号右移保留被右移的数的正负符号,例如-1对应的二进制位串为11111111 11111111 11111111 11111111,则带符号右移1位为:10111111 11111111 11111111 11111111
    • 不带符号右移 : >>>,不保留最高位(符号位),高位统一补0,不带符号右移不保留被右移的数的正负符号,例如-1对应的二进制位串为11111111 11111111 11111111 11111111,则**不带符号右移**1位为:01111111 11111111 11111111 11111111

    x >> n

    • 对于int类型,位移运算符移动的位数n需要先和31(11111)进行&操作,相当于位移数都是小于32的。
    • 对于long类型,位移运算符移动的位数n需要先和63(111111)进行&操作,相当于位移数都是小于64的。

    int数位移32位后和原数一样,long数位移64位后和原数一样。

    所以:

    1. -1 >> 32 == -1-1 >>> 32 == -1, -1 << 32 == -1为真;

    2. 因为-1的二进制为:11111111 11111111 11111111 11111111,所以 intlong类型数分别位移31位和63位,等价于位移-1int x, x >> -1 == x >> 31为真,long x, x >> -1 == x >> 63为真。

    展开全文
  • Java中移位的操作位运算学习笔记:JAVA中位运算符包括,< <> >> > >&|~^首先要搞清楚参与运算的数的位数,如int的是32位。long的是64位。如int i = 1;i的二进制原码表示为:...

    Java中移位的操作

    位运算学习笔记:

    JAVA中位运算符包括,

    < <

    > >

    > > >

    &

    |

    ~

    ^

    首先要搞清楚参与运算的数的位数,如int的是32位。long的是64位。

    如int   i   =   1;

    i的二进制原码表示为:

    00000000000000000000000000000001

    long   l   =   1;

    l的二进制原码表示为:

    0000000000000000000000000000000000000000000000000000000000000001

    二、

    正数没有反码、补码,也可以说正数的反码、补码跟原码一样。

    负数的反码为原码逐位取反,

    如int   i   =   -1;

    10000000000000000000000000000001,最高位是符号位。正数为0,负数为1。

    逐位取反后:

    01111111111111111111111111111110即反码。

    反码加1:

    01111111111111111111111111111111即补码。

    负数都是用补码参与运算的。得到的也是补码,需要减1取反获得原码。

    三、常用的位运算符--0在位运算中是比较特殊的。

    ^     异或。             相同为0,相异为1;       任何数与0异或都等于原值。

    &     与。                 全1为1,   有0为0;  任何数与0异或都等于0。

    |     或。                 有1为1,   全0为0。  任何数与0或都等于原值。

    < <   左移。             补0。

    > >   右移。             符号位是0补0,是1补1。

    > > > 无符号右移。补0。

    ~     非                     逐位取反

    四、负数参与的运算,得到的是补码,需要将补码先减1,然后逐位取反,得到原码。即为运算结果。

    0例外,如果得到的是0,则不需减1和取反。

    另外,两个正数运算后得到的就是原码,不需减1和取反。

    举例:

    1^-1,

    -1

    10000000000000000000000000000001--原码

    01111111111111111111111111111110--反码

    01111111111111111111111111111111--补码

    1

    00000000000000000000000000000001--原码

    则1^-1等于

    01111111111111111111111111111111^

    00000000000000000000000000000001=

    01111111111111111111111111111110--补码

    01111111111111111111111111111101--反码

    10000000000000000000000000000010--原码==-2

    即1^-1=-2

    举例:

    1^-2

    -2

    10000000000000000000000000000010--原码

    01111111111111111111111111111101--反码

    01111111111111111111111111111110--补码

    1

    00000000000000000000000000000001--原码

    则1^-2等于

    01111111111111111111111111111110^

    00000000000000000000000000000001=

    01111111111111111111111111111111--补码

    01111111111111111111111111111110--反码

    10000000000000000000000000000001--原码==-1

    其中可能有不对的地方,望见谅并指正。谢谢!

    ===========================================

    移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符( < > )则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(> > > ),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。

    若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java   1.0和Java   1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

    =============================================

    public   class   URShift   {

    public   static   void   main(String[]   args)   {

    int   i   =   -1;

    i   > > > =   10;

    System.out.println(i);

    long   l   =   -1;

    l   > > > =   10;

    System.out.println(l);

    short   s   =   -1;

    s   > > > =   10;

    System.out.println(s);

    byte   b   =   -1;

    b   > > > =   10;

    System.out.println(b);

    }

    }

    输出结果:

    4194303

    18014398509481983

    -1

    -1

    展开全文
  • Java 位移运算

    2020-11-19 12:05:47
    b 的位移操作时,系统会先进行 b % 32 取余操作,得到真正位移的位数 long 类型:同 int,会先进行 b % 64 的取余操作 public class TestModel { public static void main(String[] args) { long WORD_MASK =

    一、运算符

    • <<:左移运算
    • >>:右移运算
    • >>>:无符号右移运算

    二、位移超过 32/64

    • int 类型:进行 a>>b 的位移操作时,系统会先进行 b % 32 取余操作,得到真正位移的位数
    • long 类型:同 int,会先进行 b % 64 的取余操作
    public class TestModel {
        public static void main(String[] args) {
            long WORD_MASK = 0xffffffffffffffffL;
            long firstWordMask = WORD_MASK << 65; // 65 % 64 = 1,因此 -1 << 1 = -2
            long lastWordMask  = WORD_MASK >>> 64; //64 % 64 = 0,因此 -1 >>> 0 = -1
    
            System.out.println(firstWordMask);
            System.out.println(lastWordMask);
    
            System.out.println(1 << 32); // 32 % 32=0,因此为 1 << 0 = 1
        }
    }
    
    //结果:
    -2
    -1
    1
    

    三、位移值为负数

    位移为负数,则会先进行取余操作,再进行“归正”操作

    • inta = -33 --> -1 --> 31
    • long-65 --> -1 --> 63
    public class TestModel {
        public static void main(String[] args) {
            long WORD_MASK = 0xffffffffffffffffL;
    
            System.out.println(Long.toBinaryString(WORD_MASK << 63)); //左移 63 位
            System.out.println(Long.toBinaryString(WORD_MASK << -1)); //左移 63 位
            System.out.println("------------------------------------");
            System.out.println(Long.toBinaryString(WORD_MASK));
            System.out.println(Long.toBinaryString(WORD_MASK >>> -63)); //右移 1 位
            System.out.println(Long.toBinaryString(WORD_MASK >>> 1)); //右移 1 位
            System.out.println("------------------------------------");
            System.out.println(Long.toBinaryString(WORD_MASK >> -63));
            System.out.println(Long.toBinaryString(WORD_MASK >> 1));
            System.out.println("------------------------------------");
            System.out.println(Long.toBinaryString(WORD_MASK >>> -65));
            System.out.println(Long.toBinaryString(WORD_MASK >>> 63));
        }
    }
    
    //结果:
    1111111111111111111111111111111111111111111111111111111111111111
    0111111111111111111111111111111111111111111111111111111111111111
    0111111111111111111111111111111111111111111111111111111111111111
    ------------------------------------
    1111111111111111111111111111111111111111111111111111111111111111
    1111111111111111111111111111111111111111111111111111111111111111
    ------------------------------------
    1
    1
    
    展开全文
  • Java 位移运算符

    2019-02-26 11:07:21
    Java 位移运算符是Java中基本的位运算操作,但是平时工作中没有直接使用到,所以一直对其没有仔细研究过,对其实现也并不清楚。最近打算学习下HashMap的实现原理,发现里面有些代码用到了位移操作,下面的代码用到了...
  • java位移操作

    2013-06-28 16:06:58
    java位移操作 .在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系: 举例15和-15: 15的原码: 00000000 00000000 00000000 00001111   补码: 11111111 11111111 11111111 11110000  +1...
  • java位移运算符

    2017-10-19 16:27:56
    java移位运算符不外乎就这三种:>(带符号右移)和>>>(无符号右移)。  1、 左移运算符  左移运算符 1)它的通用格式如下所示:  value num 指定要移位值value 移动的位数。  左移的规则只记住一点:...
  • java 位移运算符

    千次阅读 2014-08-26 14:07:04
    java移位运算符不外乎就这三种:(左移)、>>(带符号右移)和>>>(无符号右移)。  1、 左移运算符   左移运算符使指定值的所有位都左移规定的次数。  1)它的通用格式如下所示:  value   num ...
  • java位移运算

    2014-11-19 09:32:53
    Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long、int、short、char和 byte,位运算符具体如下表: 运算符 说明 左移位,在低位处补0 ...
  • java位移操作规则

    2021-06-16 11:10:38
    byte、short、char在做移位运算之前,会被自动转换为int类型,然后再进行运算。 byte、short、int、char类型的数据经过移位运算后结果都为int型。 long经过移位运算后结果为long型。
  • java 位移操作

    2013-09-02 23:06:43
    通过对int,long类型数据左右移进行测试,发现: Java对移位运算"a ||>> b"的处理,首先做 b mod 32||64运算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然后再使用上面提到的通用移位运算规则进行...
  • 深刻理解Java位移运算符

    千次阅读 多人点赞 2018-09-28 17:11:12
    移位过程中,无论数值是正数还是负数,都在最高位补0 只对32位和64位值有意义 在Thinking in java 中有这么一句话: 只有数值右端的低5位才有用,这样可以防止我们移位超过int型值所具有的位数。(因为2的5次方为32...
  • java 位移运算

    2012-08-10 16:20:18
    &: 位运算符 位运算符,用来比较 0101 ...PS:因为位移运算的速度比乘法快很多,所以在处理数据的乘法或除法运算(当要乘或除的数字是2的次方)时,采用位移运算可以获得较快的运算速度,提高程序的运行效率。
  • 当左移的运算数是long 类型时,每移动1位它的第64位就要被移出并且丢弃。 当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。 正数和负数的左移操作分两种情况: (1)左移n位(1)之后...
  • java 的无符号右移>>>后面可以是负数:1>>>-1 以int为例: 相当于放一个数在这个数左边,负责处理溢出情况。溢出的值即为返回值。同时具有循环等效问题。 即>>>-32 == >> -64 例:...
  • JAVA位移运算符用法

    2011-12-20 17:45:24
    Java定义的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long,int,short,char,and byte。表4-2列出了位运算:  表4.2 位运算符及其结果  运算符 结果  ~ 按位非(NOT)...
  • JAVA 编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:     问题: 用最有效率的方法算出2 乘以8 等於几?” 答案:2 &...
  • java位移运算符详解

    2018-02-23 13:59:10
    当然,在Java5.0及以上版本中,移位运算符还可用于byte、short、int、long、char对应的包装器类。我们可以参照按位运算符的示例写一个测试程序来验证,这里就不再举例了。 与按位运算符不同的是,移位运算符不存在...
  • java位移运算导致数值为负数

    千次阅读 2017-03-16 22:24:22
    问题表现:java位移运算导致数值为负数问题分析:关键源代码:int startTime = (int) (promotions >> 32);int p = (int) (promotions & 0xFFFFFFFF);int duraTime = p >> 16;int rate = (int) (p & 0xFFFF);int ...
  • 刚学了位移运算,发现乘除在乘数或除数是2的几次幂数时可以用位移运算替换,并且网上都说位移运算效率高时,好奇究竟快多少便做了如下测试: public static void main(String[] args) { long a = 1; long start ...
  • 本篇主要讲述位移运算在Long中所扮演的重要角色,有些出神入化的我根本无法理解,但是我一直秉承着无论对错都要记录思考的过程的宗旨写每一篇文章。这一篇也不例外,读Long这个类确实需要比较广泛的知识面,我也是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,876
精华内容 3,150
关键字:

java位移long

java 订阅