位移运算 java_java位运算&&位移运算

位运算:位运算允许对整数中的单个比特进行操作。位运算会对连个操作数中对应的比特执行布尔代数运算,并产生一个结果。

java中有3种位运算符:&(与) |(或) ^(异或) ~(非)

看例子说明位运算的过程:

public class test{

public static void main(String[] args){

int a=12|2; //1100|0010

System.out.println(a);

}

}

结果是14(1110)

位移运算操作的目标也是数字的二进制的位。用来操作位数的向左向右移动。

java种有3种基本的位移操作:

>>(右移) <>>(无符号右移)

<

看例子:

public class test{

public static void main(String[] args){

int a=8<<1;

System.out.println(a);

}

}

8的二进制表示:00000000 00000000 00000000 00001000

左移1位后二进制:00000000 00000000 00000000 00010000 -> 14

结果为14

tip:左移相当于num*(2^n) 其中num为被移数,n为移动的位数

>>:右移的道理也是一样的,注意的是:若最高位为1,移动后最高位用1来填充,否则用0来填充。

例子:

int a=-8>>1;

System.out.println(a);

-8的二进制:11111111 11111111 11111111 11111000

右移后的二进制:11111111 11111111 11111111 11111100 -> -4

结果为-4

tip:右移相当于num/(2^n) 其中num为被移数,n为移动的位数

>>>:无符号右移跟右移原理是一样的,只是覆盖位的覆盖规则不同:不管最高位是0还是1,全部用0来填充。

例子:

int a=-8>>>1;

System.out.println(a);

-8的二进制:11111111 11111111 11111111 11111000

无符号右移后的二进制:01111111 11111111 11111111 11111100 -> 2147483644

tip:用无符号右移的时候要注意,绝对值很小的负数移动后都可能成为绝对值很大的正数,这在大多数情况下没意义。

奇葩的例外:

那代码:

int a=11>>32;

long b=12<<64;

System.out.println(a);

System.out.println(b);

int类型占32位,long类型占64位,这样子的话,上面的例子输出应该都是0才对,因为刚好将有效位都移走了,但结果并不是这样的。

输出的结果是:11 12

这跟java对位移的底层操作机制有关:

从结果可以看出两个数都没有变化,这是因为,在进行移位前,java首先将要移动的位数跟被移数的位数求余,然后去移动余数个位数。上面例子中,32对32求余,64对64求余,结果都是0,java系统对被移数进行0个位的移动,也就是没移动啦。

这样子的话,看下下面的代码:

int c=8>>33;

System.out.println(c);

因为int有32位,那么8实际上被移动的位数是:33%32=1;

就相当于:int c=8>>1;

结果自然是:4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值