-------------------------
判断奇数和偶数
1110 1111
0001 0001
0000 0001
-------------------------
交换两个数
1001 a
1010 b
0011 a=a^b
1010 b
1001 b=a^b
0011
1001
1010 a=a^b
----------------------------
乘法和除法
100>>1 10
100<<1 1000
--------------------------------
交换符号
0 1000 取反
1 0111 +1
1 1000
---------------------------------
高低位交换 a=(a<<4)|(a>>4)
1100 1011
a>>4
0000 1100
a>>4
1011 0000
取或
1011 1100
------------------------
统计1的个数
1011 a&(a-1)
1010
1010
1001 a&(a-1)
1000
每执行一次少一个1
-----------------------------
-----------------------------
二进制加法 5+3
0101 0101
0011 0011
^ 0110 0001 <<1 0010
public int add(int a, int b){
int a=a^b;
int b=a&b;
b<<1;
if(b==0) return 0;
else{
return Add(a,b);
}
}
----------------------------------
只出现一次的, 其他数字出现2次
1101
0000
1101
0和任意数字 ^ 为其本身
1101
1101
0000
两个相同的数字 ^ 结果为 0
方法: 用0和数组中的每个值进行^运算,运算结果为出现一次的数
---------------------------------------------------------------
只出现一次的, 其他数字出现3次
在具体的操作实现上,问题中给出数组中的数据在int范围之内,
那么我们就可以在实现上可以对int的32个位每个位进行依次判断该位1的个数求余3后是否为1,
如果为1说明结果该位二进制为1可以将结果加上去。最终得到的值即为答案、
class Solution {
public int singleNumber(int[] nums) {
int value=0;
for(int i=0;i<32;i++)
{
int sum=0;
for(int num:nums)
{
if(((num>>i)&1)==1)
{
sum++;
}
}
if(sum%3==1)
value+=(1<<i);
}
return value;
}
}
int a=2;
a>>1;
a<<1;
void Swap(int &a, int &b){
a=a+b;
b=a-b;
a=a-b;
}
void swap(int &a,int &b){
a=(a^b);
b=(b^a);
a=(a^b);
}
if(0==(a&1){
}
int reversal(int a){
return ~a +1;
}
int abs(int a){
int i=a>>31;
return i==0?a:(~a+1);
}
unsigned short a=34520;
a=(a>>8)|(a<<8)
unsigned short a = 34520;
a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1);
a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2);
a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4);
a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8);
count = 0
while(a){
a = a & (a - 1);
count++;
}
x=1100
x-1=1011
x&(x-1)=1000