`

JAVA的位移运算

    博客分类:
  • java
阅读更多

 

  1. 左移操作: x << n
    x可以是byte, short, char, int, long基本类型, n(位移量)只能是int型

    编译器的执行步骤:
    1) 如果x是byte, short, char类型, 则将x提升为int;
    2) 如果x是byte, short, char, int类型, 则n被重新赋值(过程是:取n的补码的低5位再转成十进制的int值,相当对n取32模: n=n%32);
       如果x是long型, 则n被重新赋值(过程是:取n的补码的低6位再转成十进制的int值,相当对n取64模: n=n%64);
       (因为int类型为4个字节,即32位,移动32位将没有任何意义.对于long则是模64)
    3) 对x左移n个位数, 整个表达式产生一个新值(x的值不变);
  2. <<是左移符号,列x<<1,就是x的内容左移一位(x的内容并不改变)
  3. >>是带符号位的右移符号,x>>1就是x的内容右移一位,如果开头是1则补1,是0责补0,(x的内容并不改变).
  4. >>>是不带符号位的右移,x>>>1就是x的内容右移一位,开头补0(x的内容并不改变)
补充说明:
Java代码 
  1. // 左移: 向左移动,右边补0  
  2. for (int i = 0;i < 8 ;i++)    
  3.     System.out.print( (1 << i) + " ");  
  4. output  
  5. 1 2 4 8 16 32 64 128   
  6.   
  7. // 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1  
  8. // 符号位为1的右移  
  9. for (int i = 0;i < 8 ;i++)    
  10.     System.out.print( Integer.toHexString(0x40000000 >> i) + " ");  
  11. output  
  12. 40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000   
  13.   
  14. // 符号位为1的右移  
  15. // 最高4位为1000, 右移1位,变成1100也就是c,  
  16. for (int i = 0;i < 8 ;i++)    
  17.     System.out.print( Integer.toHexString(0x80000000 >> i) + " ");  
  18. output  
  19. 80000000 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000  

上面的通用法则没有错,但是有一个限制,对int型,移位的位数不超过32,对long型,移位的位数不超过64。现在进行如下测试: 
Java代码 
  1. System.out.println(Integer.toHexString(0x80000000 >> 31));  
  2. // output: ffffffff  
  3. System.out.println(Integer.toHexString(0x80000000 >> 32));  
  4. // output: 80000000  

0x80000000在右移31位后,每个位都成了1(也就是-1),按照这个想法,右移32位理所当然的还是-1,可是右移32位后,得到的结果却又这个数本身。 

通过对int,long类型数据左右移进行测试,发现: 
java对移位运算"a <<||>> b"的处理,首先做 b mod 32||64运算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然后再使用上面提到的通用移位运算规则进行移位。 

到这里,就可以理解为什么在BitSet类中是 
1L << bitIndex 
这条语句,因为熟悉jdk的Programer知道,再写 1L << (bitIndex % 64) 对jdk来说是多余的。 

 

分享到:
评论

相关推荐

    java位运算操作

    Java位运算操作 左位移 右位移 与或非的操作

    JAVA位运算.pdf

    以上代码演示了各种位运算符的功能,包括按位与、按位或、按位异或、按位非以及位移运算。这些操作在实际编程中可用于高效的数据处理和算法实现,尤其在底层系统编程或性能敏感的场景中尤为重要。掌握这些位运算技巧...

    农行,笔试题,java,c

    9. Java 位移运算:&gt;&gt;&gt;运算符。 10. Java awt 包:用于 GUI 编程。 11. Java final 关键字:不可继承的类。 12. Java 系统输出:system.out.println()。 13. Java 面板默认布局:FlowLayout。 14. Java 类组成:属性...

    10_02.rar_10_02_java 位移

    这个名为"10_02.rar_10_02_java 位移"的压缩包文件,很可能包含了一个Java项目,该项目运用了位移运算来实现特定的功能,这里特别提到了"中点位移法",这可能与分形几何图形的生成有关。 中点位移法(Midpoint ...

    JAVA基础之java的移位运算

    Java的移位运算涉及到整数类型数据的二进制位操作,这对于理解计算机底层运作和优化代码至关重要。移位运算主要包括左移运算符()和右移运算符(&gt;&gt;,&gt;&gt;&gt;)。在Java中,所有的整数类型(除了char类型外)都是有符号...

    java位运算大全.pdf

    Java位运算大全涵盖了Java中位运算的基本概念、运算符以及其应用。位运算是一种直接对整数型数据的二进制位进行操作的运算,它可以用于高效地处理数据,尤其在系统底层开发和算法设计中至关重要。 首先,位运算的...

    java byte相互转换详解左右位移

    在Java中,基本数据类型byte与int之间的相互转换涉及到计算机的二进制运算、位移操作以及补码的概念。我们首先了解Java中int和byte的数据结构,然后探讨它们之间的转换方法及其背后的原理。 **基本数据类型结构:**...

    中科软面试笔试题

    Java位移运算 - 位移运算符如右移(`&gt;&gt;`)、左移(`)等,在处理二进制数据时非常有用。 #### 8. 数组初始化 - Java中数组的初始化方式及其注意事项。 #### 9. 其他题目 - 涉及到其他一些基础概念和技术点,例如字符...

    java 位运算知识

    Java 位运算是编程语言中的一种底层操作,它允许我们直接对整数类型的数据进行按位操作,包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()、右移(&gt;&gt;)和无符号右移&gt;&gt;&gt;。这些操作在处理二进制数据、优化...

    【循序渐进学.java】从入门到精通.第20讲-二进制.位运算.位移运算.zip

    绝对韩顺平老师的讲解视频!教学文件打包太大,就一个一个的上传了! avi格式的,最好用KMPlayer来播放,下载地址:https://www.kmplayer.com/home 后续还上传,韩顺平老师教学的源代码!

    java位运算加密示例

    此外,位运算在Java编程中还有其他的应用,例如位掩码、位移操作等,它们在处理二进制数据、优化性能等方面都有重要作用。但作为加密手段,位运算往往只作为更复杂加密算法的一部分,而不是独立的解决方案。在设计...

    有限单元法求解跨中的位移java实现

    本项目是通过Java编程语言实现的,旨在计算跨中的位移,具体涉及到矩阵运算和线性代数的概念。 在有限单元法中,一个复杂的结构被划分为多个简单的单元,每个单元的特性可以通过其几何形状和材料属性来定义。然后,...

    java经典位运算实例宣贯.pdf

    }`或`(x+y)^y`,通过位移和异或运算找到x的符号位,然后与x异或以消除符号位。 6. **取模和位运算**: - `a % (2^n) == a & (2^n - 1)`,当a和2^n没有溢出时,可以将取模运算转换为位与运算。 7. **乘法和位运算...

    大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制运算.zip

    大数运算库如Java的BigInteger和Python的decimal模块,可以提供不受限制的精度,确保计算结果的准确无误。 2. **加法与减法**:对于大数,基本的加减法操作需要考虑到进位和借位,尤其是在二进制表示下,这涉及到每...

    Java排列组合算法分析和代码实现

    3. 位运算的理解:在组合算法中,位运算的运用可以显著提升算法性能,你需要熟悉位运算符及其在Java中的使用。 4. 缓存优化:对于组合问题,可以考虑使用缓存存储已计算的结果,避免重复计算。 总之,这个资源包...

    Java byte 位移操作 注意事项

    Java对byte 的 + – * / &gt;&gt; &gt;&gt;&gt; &lt;&lt; & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先将byte转化为int, 再行运算。这一事实可能导致多种问题:  假设我们想进行如下...

    Java大数字运算之BigInteger <font color=red>原创</font>

    Java中的BigInteger类是用于处理大整数运算的重要工具,它弥补了Integer类在处理超过int类型范围(2^31-1)数值时的局限性。BigInteger类支持任意精度的整数运算,这意味着它可以准确地表示和计算非常大的数值,无论...

    文件移位加密与解密

    从给定的文件信息来看,本文档主要涉及的是文件移位加密与解密技术的C语言实现,这是一项基础但非常实用的加密方法,尤其在早期计算机科学领域中占有重要地位。下面,我们将深入探讨这一主题,包括其背景、原理、...

    Java语言的26个细节

    然而,Java对位移运算的处理有一些独特的规定,特别是当位移次数超过32时的行为。例如,当我们尝试将一个整数`a`左移33位时,按照直观理解,似乎所有有效位都将被移出,结果应该是0。然而,在Java中,`a 实际上是...

Global site tag (gtag.js) - Google Analytics