java中的移位问题 程序如下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的移位问题 程序如下相关的知识,希望对你有一定的参考价值。

for(int j=31;j>=0;j--)
if(((1<<j)&i)!=0)
System.out.print("1");
else
System.out.print("0");
求教这个程序的原理,详细一点

我们知道,在java中,int是占4个字节的,也就是32位。
这个程序,应该是为了将一个int类型转换成32位2进制数。
原理:
1. <<:左移运算符,在没有数字溢出的情况下,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
2. &:位运算符,当两边操作数的位同时为1时,结果为1,否则为0。如111 & 101 = 101。
切入正题:
1. 为了取得32位完整的二进制数,需要循环32次,1<<31即2的31次方,表示最高位为1,其余31位均为0的二进制数;1<<30即2的30次方,表示第二位为1,其余31位均为0的二进制数;以此类推。
2. 程序从高位开始转换int类型,我们想要截取二进制数的特定某位时,我们需要用一个此位为1,其余位均为0的二进制数来做&运算,例如,我们想截取15的最高位,我们只需使用最高位为1的32位二进制数与15做&运算即可。因为假设假设某位为1,1 & 1 = 1,假设某位为0,0 & 1 = 0,均能得到原来的数。而1或0与0相与均为0.

总之,程序是从高位到低位依次一位一位截取int对应二进制数,输出的结果便是int对应的二进制数追问

1<<31表示左移31位?那1表示什么?

追答

int 1
到了cpu里面,数据都是以2进制计算的,1 << 31即000.....1(32位)左移31位,变成10000..000(32位)- 转换成10进制是2的31次方

参考技术A 你要化成二进制来求解的。 比如 2<<3 ; 2的二进制为 00000010;<<就是向左移动三位,变成00001000就是变成了8; 参考技术B 你的i值未声名,没办法给你解释。

java中的移位操作

java中的移位操作只对int和long有效,byte、short、char升级为int后再进行移位


移位操作符有>>(右移)、<<(左移)、>>>(右移)三种,注意两点:1.没有<<<符号  2.移位是不循环的

三种的区别是

>>是带符号右移,负数高位补1,正数补0         ----->>>也就是在高位用符号位进行填充。

<<左移不管负数还是正数,在低位永远补0

>>>是不带符号右移,不论负数还是正数,高位补0( 无符号右移,忽略符号位,空位都以0补齐


在具体的运算中全部转化为补码逻辑进行移位或者按位运算。


测试程序:

[java]  view plain  copy