- 位运算在古老的计算机中计算速度略高于加法运算,效率远远高于乘法运算,但是在现代计算机中虽然位运算的速度已经和加法运算差不多,但是依旧远远高于乘法运算的效率
190.颠倒二进制位
136.只出现一次的数据
190.颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。
在开始打算使用String颠倒二进制位,但是由于使用java,当输入的形式为负数时,则不能根据底层储存改变数据实现题目要求。
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
(1)获取整数,通过右移,从低位向高位移动
(2)每次只获取最低位,并向前移动相应的位数
public int reverseBits(int n) {
int result = 0;
for (int i = 0; i <= 32; i++) {
//n >> i & 1通过为位运算得到相应的最低位
int temp = n >> i & 1;
//使用|运算将每次的结果结合起来
result = result | (temp << (31 - i));
}
return result;
}
- 过程图(以43261596为例)
-
& 运算,两位均为1才能使结果为1,否则均为0
| 运算 , 两位均为0才能使结果为0,否则均为1
136.只出现一次的数据
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
-
尽量不使用额外的空间
-
^ 运算,按位异或,当两数值完全相同时,返回值为0,^ 0 得到数值本身,同时可以通过两次异或相同值,也可以得到数值本身。
public int singleNumber(int[] nums) {
int result = nums[0];
if (nums.length > 1) {
for (int i = 1; i < nums.length; i++) {
result = result ^ nums[i];
}
}
return result;
}