前提:位运算只能用于整型数值。
原因:位运算使用的是二进制,而整型在内存中就是按照二进制存储。
1.常见的位运算使用场景:
位运算是一种计算机中的基本运算,它针对二进制位进行操作。Java中的位运算符包括按位与(&)、按位或(|)、按位异或(^)、取反(~)以及左移位和右移位运算符(<<, >>, >>>)等。
位运算的优势:提高计算速度,节省内存等。
(1).按位与运算(&):指的是两个数“二进制“位上对应的数,都为1,结果位上对应的数才为1.否则为0. 如下图所示
(2).按位或运算 (|):指的是两个数“二进制“位上对应的数,都为0,结果位上对应的数才为0.否则为1. 如下图所示
(3).按位异或运算(^):按位异或运算是指两个二进制数对应位上的数字不相同时,结果位上的数字为1;否则结果位上的数字为0。如下图所示:
(4).取反运算(~):按位取反运算是指一个二进制数的每个位取反,即0变成1,1变成0。
如图所示,因为二进制表示位为32位,前面的0并未显示,当取反之后变成1,会显示出来
(5.)左右移位:
左移位:左移运算是将一个数的二进制位向左移动1位
作用:可以将数字扩大1倍
右移位:右移运算是将一个数的二进制位向右移动1位
作用:可以将数字缩小1倍
使用场景:
因为位运算的计算效率高,占用内存小等原因,在计算方面有许多优势。可以使用在求平均值,数字交换,判断奇偶数,扩大缩小数字,求2的n次幂,4的n次幂等
1.求平均值:
int n = 8;
int y = 10;
int avg = (n&y)+((n^y)>>1);//求平均值
2.数字交换:
int n = 8;
int y = 10;
n = n ^ y;
y = n ^ y;
n = n ^ y;
3.判断奇偶数:一个数和0按位与运算(n&0==0)等于0为偶数
一个数和1按位与运算(n&1==0)等于1为奇数
4.判断一个数是否为2的n次幂:
5.判断一个数是否为4的n次幂
//求解4的幂
//分析:是4的幂,必是2的幂
//即先判断是否为2的幂,再判断是否为4的幂
//如果是4的幂,则其二进制仅包含以后个1,并且一定在偶数位(低位从0开始计算)
int b= 2048;
int flag = 0b10101010101010101010101010101010;
String ret1 = ((a & (a-1))==0)&&((b & flag)==0)?"是":"不是";
System.out.printf("整数%d%s4的幂",b,ret1);
6.数组中寻找出现次数为1次的
实现思路:将数组所有元素异或在一起(相同元素异或后为0)。就会得到