位运算相关知识点
- & 与
两位都为1,否则为0 - | 或
一位为1,就为1,否则为0 - ^ 异或
相同为0,不同为1 - ~ 非
1 为 0, 0 为 1
344. Reverse String
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
最简单的做法
new StringBuilder(s).reverse().toString();
更高效的做法
public String reverseString(String s) {
char[] array = s.toCharArray();
for(int i = 0, j = array.length - 1; i < j; i++, j--){
char tmp = (char) (array[i] ^ array[j]);
array[j] = (char) (tmp ^ array[j]);
array[i] = (char) (tmp ^ array[i]);
}
return new String(array);
}
例如:
0010 ^ 0101 = 0111;
0010 ^ 0111 = 0101;
0101 ^ 0111 = 0010;
这样就完成了两个数的调换,使用位运算更加高效
190. Reverse Bits
题目:给定一个32位int型数,反转其二进制数
例如:
12的二进制为:0000 0000 0000 0000 0000 0000 0000 1100
反转二进制位:1100 0000 0000 0000 0000 0000 0000 0000 (805306368)
思路:首先定义一个result为0,一步步得取出12中二进制的最后一位,与result相加,并将result左移一位
代码:
public int reverseBits(int n) {
if (n == 0){
return n;
}
int result = 0;
for(int i = 0; i < 32; i++){
result <<= 1;
result += n & 1;
n >>= 1;
}
return result;
}
136. Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
给定整数数组,除了一个元素之外,每个元素都会出现两次。 找到那个单一的。
解析:
N1 ^ N1 ^ N2 ^ N2 ^ N3 = N3
public class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for (int i : nums) {
res ^= i;
}
return res;
}
}