&与 |或 ^异或 ~非
>>右移 <<左移
>>>0填充高位 >>符号位填充高位
用法:判断奇偶数 x&1 获取二进制位 交换两个整数的值 求绝对值
题1-1:如何找出数组中唯一成对的数
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = new int[1001];
for(int i=0;i<1001;i++) {
nums[i] = i;
}
nums[0]=179;
int res = 0;
for(int i=0;i<1001;i++) {
res = res^nums[i];
res = res^i;
}
System.out.println(res);
}
题1-2:找出落单的数
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = {1,1,3,3,7,7,9,9,5};
int res = 0;
for(int i=0;i<nums.length;i++) {
res = res ^ nums[i];
}
System.out.println(res);
}
题1-3:二进制中1的个数
解1:比对最后一位 右移
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 9;
int cnt = 0;
for(int i=0;i<32;i++) {
if((num&1)==1) cnt++;
num = num >> 1;
}
System.out.println(cnt);
}
解2:x^(x-1) 去掉最低位的1
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 9;
int cnt = 0;
while(num>0) {
num = num & (num-1);
cnt++;
}
System.out.println(cnt);
}
题1-4:是不是2的整数次方
n&(n-1) 去掉最后一个二进制位的1
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 64;
if(((num-1)&num)==0) {
System.out.println("true");
}else {
System.out.println("false");
}
}
题1-5:整数的奇偶位互换
public static void main(String[] args) {
int num = 9;
int n1 = num&0xaaaaaaaa;//10101010....
int n2 = num&0x55555555;//01010101....
n1=n1>>1;
n2=n2<<1;
System.out.println(n1|n2);
}
题1-6:二进制表示浮点实数
public static void main(String[] args) {
double num = 0.625;
StringBuilder sb = new StringBuilder("0.");
while(num>0){
double r = num * 2;
if(r>=1){
sb.append("1");
num = r-1;
}else{
sb.append("0");
num = r;
}
if(sb.length()>34){
System.out.println("ERROR");
return;
}
}
System.out.println(sb.toString());
}
题1-7:出现k次与出现1次
k次k进制不进位加法等于0
public static void main(String[] args) {
int[] arr = {1,1,1,100,3,3,3,7,7,7};//k=3
int len = arr.length;
char[][] kRadix = new char[len][];
int k = 3;
int maxLen = 0;
for(int i=0;i<len;i++){
kRadix[i] = new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
if(kRadix[i].length>maxLen){
maxLen = kRadix[i].length;
}
}
int[] resArr = new int[maxLen];
for(int i=0;i<len;i++){
for(int j=0;j<maxLen;j++){
if(j>=kRadix[i].length) {
resArr[j]+=0;
}else{
resArr[j]+=(kRadix[i][j]-'0');
}
}
}
int res = 0;
for(int i=0;i<maxLen;i++){
res += (resArr[i]%k)*(int)(Math.pow(k,i));
}
System.out.println(res);
}