位运算你真的懂了吗?

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 程序设计/唐大仕编著》

猜你喜欢

转载自blog.csdn.net/qq_41262903/article/details/106573533