1.判断奇偶数: x&1=1为奇 x&1=0为偶 (主要看二进制最后一位为1还是0)
2.获取二进制位是1还是0 :左移,然后做“与”运算
例题:
1.1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将他找出来,不用辅助存储空间。
思路一:异或可去除重复元素
思路二:数组,暴力枚举(利用数组下标)
import java.util.Random;
public class 唯一成对的数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int N=10;
int[] arr=new int[N];
//先给前1000个数赋值
for(int i=0;i<N-1;i++) {
arr[i]=i+1;
}
//最后一个数为随机数
arr[arr.length-1]=new Random().nextInt(N-1)+1;
//随机下标
int index=new Random().nextInt(N-1);
int temp=arr[index];
arr[index]=arr[arr.length-1];
arr[arr.length-1]=temp;
for(int element:arr) {
System.out.print(element);
System.out.print(' ');
}
System.out.println();
//0^A=A A^A=0 利用异或可消除重复
int x1=0;
for(int i=1;i<=9;i++)
x1=(x1^i);
for(int i=0;i<arr.length;i++)
x1=x1^arr[i];
//最终x1的值就是那个重复的数
System.out.println(x1);
}
}
2.二进制中1的个数
请实现输入一个整数,输出该数二进制中1的个数
eg.9的二进制为1001,输出2
思路一:类似于判断二进制位是0还是1,只不过要加个循环,数出1的个数即可 左移与原数做“与”运算
import java.util.Scanner;
public class 二进制中1的个数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(Integer.toString(n,2));//输出二进制
int cnt=0;
for(int i=0;i<32;i++) { //整数为32位,所以进行32次循环
if((n&(1<<i))==(1<<i)) cnt++;
}
System.out.println(cnt);
}
}
思路二:每次消除个1,记录消除的次数。(原二进制数-1)&原二进制数 就把最低位1消除了,然后再加上个循环,在记录消除的次数。
import java.util.Scanner;
public class 二进制中1的个数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(Integer.toString(n,2));//输出二进制
int cnt=0;
while(n!=0) { //n为0停止循环
n=(n-1)&n;
cnt++;
}
System.out.println(cnt);
}
}