左移和右移的运算规则_位运算及其妙用

8bd3f365ee7c3e2432930fd5c379c5b2.png

程序中的所有数在计算机内存中都是以二进制的形式储存的,即只有0和1两种数值,位运算就是直接对整数在内存中的二进制位进行。

1<

运算规则:a<

例:

 3: 00000000 00000000 00000000 00000011 // 左移2位,空位补2个0 3<<2: 00000000 00000000 00000000 00001100

所以,3<<2 = 12

规律:a左移b位,就是a乘以2的b次方。

2>>(向右位移)

运算规则:a>>b,表示a转为二进制后右移b位,右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1。

例:

 4: 00000000 00000000 00000000 00000100 // 右移1位。右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1 4>>1 00000000 00000000 00000000 00000010

所以,4 >> 1 = 2

规律:a右移b位,就是a除以2的b次方。

3&(与运算)

运算规则:相同位的两个数字都为1,则为1;若有一个不为1,则为0。

例:

 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5&6: 00000000 00000000 00000000 00000100 

所以,5&6 = 4

4|(或运算)

运算规则:相同位只要有一个为1即为1。

例:

 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5|6: 00000000 00000000 00000000 00000111 

所以,5|6 = 7

5^(异或运算)

运算规则:针对二进制位,如果某位不同则该位为1, 否则该位为0。

例:

 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5^6: 00000000 00000000 00000000 00000011 

所以,5^6 = 3

6~(取反运算)

运算规则:对二进制各位数进行取反,即1变成0,0变成1。

例:

 5: 00000000 00000000 00000000 00000101 ~5: 11111111 11111111 11111111 11111010 // 补码形式 11111111 11111111 11111111 11111001 // 反码 10000000 00000000 00000000 00000110 // 原码

所以,~5 = -6

位运算的一些妙用

  • 在不使用第三个变量的情况下,如何交换两个变量的值?

常规操作:

 void swap(int a, int b) { int temp = a; a = b; b = temp; }

骚操作:

 void swap(int a, int b) { a^=b; b^=a; a^=b; }
  • 判断奇偶

常规操作:

if (a%2 == 0) {System.out.println("偶数");} else {System.out.println("奇数");}

骚操作:

if ((a&1) == 0) {System.out.println("偶数");} else {System.out.println("奇数");}
  • 求平均数

常规操作:

 int average(int x, int y) {  return (x+y)/2;  } 

骚操作:

 int average(int x, int y) {  return (x&y)+((x^y)>>1);  } 

推荐阅读:

浅谈Java中的命名规范

一文带你认识Java8中接口的默认方法

深入理解Java中方法的参数传递机制

阿里开发者招聘节 | 2019阿里巴巴技术面试题集锦

可能你不知道的,关于自动装箱和自动拆箱

抽象类和模板方法模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值