位运算

更新于 2015-12-10  约 3 分钟

基本概念

适用对象:整数类型变量(char,short,int,long等)
作用:改变二进制位

有什么用

  1. 判断某一位是否为1

  2. 只改变其中一位,其他位不变

  3. 快速计算

分类

& 按位与(双目)
| 按位或(双目)
^ 按位异或(双目)
~ 按位非(取反)(单目)
<< 左移(双目)
>> 右移(双目)

双目:两个数折腾
单目:自己折腾

按位与&

口诀:同1为1
x&1: 不变
x&0: 结果必为0

例子

21 & 18
21: 0001 0101
18: 0001 0010
16: 0001 0000

作用

  • 某些位清零,同时保持其他位不变

最低位清零, n & 0xfe
   n: 1001 0111
Oxfe: 1111 1110
      1001 0110
  • 获取变量中的某一位

获取第7位,下标从0开始
   n: 1010 1010
0x80: 1000 0000
      1000 0000

按位或|

口诀: 有1为1
x|1: 结果必为1
x|0: 不变

例子

21 | 18
21: 0001 0101
18: 0001 0010
23: 0001 0111

作用

  • 某些位置为1,同时保持其他位不变

最低位置为1, n & 0x01
   n: 1001 0110
Ox01: 0000 0001
      1001 0111

按位异或^

口诀: 不同为1
x^1: 取反
x^0: 不变

例子

21 | 18
21: 0001 0101
18: 0001 0010
 7: 0000 0111

作用

  • 取反(~运算符可以达到同样的效果)

21 | 0xff
21:   0001 0101
oxff: 1111 1111
      1110 1010
  • 加密

如果 a^b=c,那么就有 c^b = a以及c^a=b

  • 交换值

int a = 5, b = 7; 
a = a ^ b;
b = b ^ a;
a = a ^ b;

按位非~

口诀:取反

例子

~21
21: 0001 0101
    1110 1010

左移<<

口诀:高位丢弃,低位补0

例子

9 << 4
  9: 0000 1001
144: 1001 0000

作用

  • 左移n位,相当于乘以2^n

144 = 9 * 2^4 = 9 * 16

左移>>

口诀:有符号,低位丢弃,高位补符号位;无符号,低位丢弃,高位补0 (无符号,符号位相当为0)

作用

  • 右移n位,相当于除以2^n,最后向下取整

正数
127 >> 4
127: 0111 1111
  7: 0000 0111

7 = 127 / 2^4 = 127 / 16 = 7.9375
向下取整为7

负数
-127 >> 4
-127: 1000 0000
  -8: 1111 1000

-8 = -127 / 16 = -7.9375
向下取整为-8,而不是-7

无符号
128 >> 4
128: 1000 0000
  8: 0000 1000

8 = 128 / 8 = 8
向下取整为8
阅读 1.3k更新于 2015-12-10

推荐阅读
人工智能之路
用户专栏

一只笨鸟的人工智能之路

5 人关注
26 篇文章
专栏主页
目录