1、概述
在计算机中,所有的数据都是以二进制方式存储的。位运算就是对内存中的二进制数据进行操作,因此处理数据的速度非常快。如果在实际的编程过程中,能够巧用位运算,能够达到四两拨千斤的效果。下面就对位操作进行一下总结,示例代码为C++。
2、位操作基础
基本的位操作有与、或、异或、取反、左移、右移这六种,他们的运算规则如下:
注意以下几点:
1、只有~(取反)操作是单目运算符,其它5种都是双目运算符。
2、位操作只能用于“整形”数据,对 float 和 double 类型进行位操作,编译器会报错。
3、算术右移就是右移之后的填充位使用符号位数据。java中为了区分算术右移和逻辑右移,使用了明确的定义。x >> k 会将x算术右移k个位置,x >>> k 会对 x 做逻辑右移。
4、位操作的运算优先级比较低,因此尽量使用括号来确保运算顺序。如:int a = 1 << i + 1;程序会先执行 i+1,在执行 左移操作。
3、原码、反码、补码
原码:符号位 + 绝对值的二进制。
反码:正数的反码是其本身。负数的反码是在原码的基础上,符号位不变,其余位取反。
补码:正数的补码是其本身。负数的补码是其 反码+1
举例:
计算机中正数用原码表示,负数用补码表示。其实也可以说成所有的数都是用补码的形式存储的。如: 9 计算机存储为 0000 1001,-9计算机存储为 1111 0111。
注意:1000 0000 = -128。而不是所谓的-0,没有-0一说,所以int的取值范围为 - 2 31 2^{31} 2