`

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基础之java的移位运算

    因为Java 使用2的补码来存储负数,并且因为Java 中的所有整数都是有符号的,这样应用位运算符可以容易地达到意想不到的结果。例如,不管你如何打算,Java 用高位来代表负数。为避免这个讨厌的意外,请记住不管高位的...

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

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

    java位运算加密示例

    通过位运算中的"^"异或运算符把字符串与一个指定的值进行异或运算,从而改变字符串每个字符的值,这样就可以得到一个加密后的字符串

    Java byte 位移操作 注意事项

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

    文件移位加密与解密

    文件移位加密与解密 C语言实现 完整代码 截图显示

    JavaScript中进行byte的计算(含java及js查表法生成crc的代码)

    网络资源的整合,以及自己摸索使用JavaScript进行byte计算的路,包括详细的文档,范例代码(java和js按算法crc16生成crc码),为下载其中资源,花费若干分,所以设定了下载分。谢谢大家!

    java从入门到精通视频教程(全94讲)学习笔记整理(齐全).docx

    -二进制、位运算、位移运算 -集合 -集合 -集合 -集合补充 -异常 -面试题评讲 -布局管理器 -常用组件 -swing编程实战 -绘图技术.坦克大战2 -事件处理.坦克大战3 -事件监听.坦克大战4 -事件总结.坦克大战5 -线程.坦克...

    学通Java的24堂课

    3.8.6 基本功训练6——位移实现数字乘以2的8次幂 86 3.9 情景应用——拓展与实践 86 3.9.1 情景应用1——输出长方形面积 86 3.9.2 情景应用2——输出字节bit位的值 87 3.9.3 情景应用3——判断奇偶数 88 3.9.4 ...

    java8集合源码-product1:产品1

    java8 集合源码 一、JAVA技术栈 Spring ...位移运算 &lt;&lt; : 左移运算符,num &lt;&lt;1,相当于num乘以2 int n = 7; // 00000000 00000000 00000000 00000111 = 7 int a = n &lt;&lt; 1; // 00

    java编程基础,应用与实例

    3.6.3 String型对象与基本数据类型间的运算 25 3.7 运算符 25 3.7.1 逻辑非(!) 26 3.7.2 位非运算符(~) 26 3.7.3 符号运算符(+、-) 27 3.7.4 增减运算符(++、--) 27 3.7.5 算术运算符(+、-、*、/) 29...

    二进制一些笔记,可以看看,新手上路勿喷

    对于java二进制的一些笔记,位移运算,可以看看,新手上路勿喷

    矩阵位移法matlab代码-MDM:Matrixdisplacementmethod/矩阵位移法

    实现了矩阵位移法的计算机运算,包含以下功能: 单元刚度矩阵的计算 整体刚度矩阵的集成 求解线性代数方程组 求解病态线性方程组 绘制结构的内力图 保存各单元的杆端力向量 文件结构说明 输入文件结构说明 文件保存...

    21天学通Java-由浅入深

    ”:非运算符 54 3.4.4 逻辑运算符总结 54 3.5 三元运算符 55 3.6 位运算符 55 3.6.1 “&”:按位与运算符 56 3.6.2 “|”:按位或运算符 56 3.6.3 “^”:按位异或运算符 57 3.7 位移运算符 57 3.7.1 “&gt;&gt;”:带...

    Java模拟计算机的整数乘积计算功能示例

    主要介绍了Java模拟计算机的整数乘积计算功能,简单分析了计算机数值进制转换与通过位移进行乘积计算的原理,并结合具体实例给出了java模拟计算机成绩运算的相关操作技巧,需要的朋友可以参考下

    基于MATLAB平台的数字信号处理仿真演示系统.zip

    本设计带有一个丰富得GUI人机交互界面,一共包括4个部分,分别为:离散时间信号的卷积,基本函数的Z变换(单位阶跃信号,脉冲信号,斜变信号,正余弦信号,指数系列信号),Z变换的基本性质(线性,位移,z域… ...

    javascript基本语法

    :)、位移运算符(|,&,&lt;&lt;,&gt;&gt;,~,^)和字符串运算符(+)。 可能很多人不知道”===”是什么。 在这里,我为大家解释一下,在javascript中,“==”是等同运算符。 等同运算符的比较规则: 当两个运算数的类型不同时:...

    JavaScript基础和实例代码

    1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第2章 JavaScript语言入门 2.1 编程准备 2.1.1 编程术语 2.1.2 脚本执行顺序 2.1.3 大小写敏感 2.1.4 空白字符 2.1.5 分号 2.1.6 块 ...

    源文件程序天下JAVASCRIPT实例自学手册

    1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第2章 JavaScript语言入门 2.1 编程准备 2.1.1 编程术语 2.1.2 脚本执行顺序 2.1.3 大小写敏感 2.1.4 空白字符 2.1.5 分号 2.1.6 块 ...

Global site tag (gtag.js) - Google Analytics