1.前言
在任何一门编程语言基础中都不可避免使用运算符。运算符都有赋值运算符、比较运算符、逻辑运算符、位运算符。对于前面三种运算符每一个编程学习者应该都有学过,但是对于第四种可能就不是每个人都学过,我也一样,在起初学习的过程中并不是那么了解位运算符。所以这篇文章我将好好的梳理位运算符的使用。
2.知识准备
由于位运算符操作的都是二进制位(0101010),所以在看下面的内容之前建议看看这篇原码、补码、反码详解,进一步了解二进制位操作。
3.位运算符详解
位运算符有如下图几种:
1.按位取反运算符 ~
~
是一元运算法,对数据的每个二进制位取反,即把 1 变为 0,把 0 变为 1。
例:
00010101 取反后为
11101010
2.按位与运算符 &
参与运算的两个值,如果两个相应位都为 1,则该位的结果为 1,否则为 0。即,0 & 0 = 0,0 &1 = 0,1 & 0 = 0,1 & 1 = 1。
例:
00101010 (&)
00010111
00000010
按位与可以用来对某些特定的位清零。如,对数 11010110 的第 2 位和第 5 位清零,可让该数与 11101101(从有效位的前一位开始计算)进行按位与运算。
11010110 (&)
11101101
11000100
按位与可以用来取某个数中某些指定的位。如,要取数 11010110 的第 2 位和第 5 位, 可让该数与 00010010 进行按位与运算。
11010110 (&)
00010010
00010010
3.按位或运算符 |
参与运算的两个值,只要两个相应位中有一个为 1,则该位的结果为 1。即:0 | 0 = 0, 0 | 1 = 1,1 | 0 = 1,1 | 1 = 1。
例:
00101010 ( | )
00010111
00111111
按位或运算符可以用来把特定位置变为1。
4.按位异或运算符 ^
参与运算的两个值,如果两个相应位相同,则结果为 0,否则为 1。即:0 ^ 0 = 0,1 ^ 0 = 1,0 ^ 1 = 1,1 ^ 1 = 0。
例如:
00101010 ( ^ )
00010111
00111101
通过按位异或运算,可以实现两个值的交换,而不使用临时变量。例如,交换两个整 数 a、b 的值,举例如下:
a = 11010110,b = 01011001
a = a ^ b; // a = 10001111
b = b ^ a; // b = 11010110
a = a ^ b; // a = 01011001
5.左移运算符 <<
用来将一个数的各二进制位全部左移若干位。例如,a = a<<2,使 a 的各二进制位左移 2 位,右补 0,若 a = 00001111,则 a<<2 = 00111100。高位左移后溢出,舍弃不起作用。
在不产生溢出的情况下,左移一位相当于乘 2,而且用左移来实现乘法比乘法运算速 度要快。
6.右移运算符 >>
用来将一个数的各二进制位全部右移若干位。例如,a = a>>2,使 a 的各二进制位右移 2 位,移到右端的低位被舍弃,最高位则移入原来高位的值。如,a = 00110111,则 a>>2=00001101;b = 11010011,则 b>>2 = 11110100。
右移一位相当于除 2 取商,而且用右移实现除法比除法运算速度要快。
7.无符号右移运算符 >>>
用来将一个数的各二进制位无符号右移若干位,与运算符>>相同,移出的低位被舍弃, 但不同的是最高位补 0。如,a = 00110111, 则 a>>>2 = 00001101;b = 11010011, 则 b>>>2=00110100。
本文参考:
《Java 程序设计/唐大仕编著》