(一)2的幂
(1)题目描述
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
(2)思路:(n&(n-1))==0 ||
n > 0 && (n & -n) == n;
(3)代码
class Solution38 {
public boolean isPowerOfTwo(int n) {
/*if(n==2||n==0){
return true;
}
if(n%2!=0){
return false;
}
//递归方法层次太深,所以会出现java.lang.StackOverflowError
return isPowerOfTwo(n/2);*/
// 利用位运算(1)
// return n > 0 && (n & (n - 1)) == 0;
// 利用位运算(2)
return n > 0 && (n & -n) == n;
}
}
(二)
(1)题目
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
(2)思路:n & (1<<i))!=0
(3)代码
class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
//将1循环左移,若与当前数与时不为0,表示n当前位置的数为1,否则为0
int result = 0;
for (int i = 0; i < 32; i++) {
if ((n & (1<<i))!=0) {
result++;
}
}
return result;
}
}
(三)
(1)题目:颠倒给定的 32 位无符号整数的二进制位。
(2)代码:
class Solution02 {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int rev=0;
//添加条件n!=0:若n做了逻辑右移操作后,若其在某步操作后变为0,则后面就没有再继续移位操作的必要了
for (int i = 0; i <32&&(n!=0) ; i++) {
/*
* 解读:
* (1)n&1:取n得最后一位
* (2)(n&1)<<(31-i):将最后一位向左移31-i位,此时的结果中只有一位有效位(可能为1,可能为0),其余位全为0以此来进行颠倒操作
* (3)rev|=(n&1)<<(31-i):将上一步的结果与全0进行或操作,得到最终结果
* (4)n>>>=1:n算术右移1位,方便取末位
* */
rev|=(n&1)<<(31-i);
n>>>=1;
}
return rev;
}
}
(四) 只出现一次的数组
(1)题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
(2)思路:利用异或
任何数和 00 做异或运算,结果仍然是原来的数,即 a \oplus 0=aa⊕0=a。
任何数和其自身做异或运算,结果是 00,即 a \oplus a=0a⊕a=0。
异或运算满足交换律和结合律,即 a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=ba⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
(3)代码
class Solution03 {
public int singleNumber(int[] nums) {
int reslut=0;
//普通方法
/*int j;
int result=0;
Arrays.sort(nums);
for (int i = 0; i < nums.length-1; i++) {
j=i+1;
while (nums[i]==nums[j]){
j++;
}
if(j-i==1){
result=nums[i];
break;
}else{
i=j-1;
}
}
return result;*/
//异或方法
for (int i:nums) {
reslut^=i;
}
return reslut;
}
}