位运算的技巧

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);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值