位运算的小技巧

一:按位与&

与运算&,
 *规则,false&false=false,false&true=fasle, true&fasle=false,true&true=true
 * 在c语言中,false是0,true是1,所以
 * 1&1=1;1&0=0;0&1=0;0&0=0

*可以用来判断奇偶性,计数二进制最后一位为1
让任意数&1,判断最后一位xxxxxxxx是否为1,如果是奇数
最后一位为1,反之为0

import java.util.Scanner;

public class 按位与 {
	/*
	 * 与运算&,规则,false&false=false,false&true=fasle
	 * true&fasle=false,true&true=true
	 * 在c语言中,false是0,true是1,所以
	 * 1&1=1;1&0=0;0&1=0;0&0=0
	 * 可以用来判断奇偶,让任意数&1,即&xxxxxxx1,可以判断最后一位xxxxxxxx是否为1,入伙实奇数
	 最后一位为1,反之为0
	 */
	public static void main(String[] args) {
		System.out.println("输入一个数字,判断奇偶");
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		if((n&1)==1)	System.out.println("奇数");
		else	System.out.println("偶数");
	}
}

二:按位或

*或运算|,false|fasle=false,false|true=true,true|true=true,true|false=true
*即 1|1=1,1|0=1,0|1=1,0|0=0

三:按位异或^

*按位异或^ ,相同为0,不同为1,0^ 0=0,0^ 1=1,1^ 0=1,1^1=0

  • 异或^,用于比较两个二进制的相应位,按位异或是,如果二进制对应的的位
  • 异或0,则返回0,1^0=1,相当于二进制的加法,但是不进位
  • 1^ 1=0.0^ 0=0,1^0=1,任何数字和1异或都等于它本身
  • a^ a^ b^ c^b=c
    例题:一组连续的数字,只有一个数字是成对的,其他都是单个的,求连续成对的数字
    *两种解法:
    *1.位运算:比如,1,2,2,3。让其与1,2,3异或,可以排除出了成对的其他数字
    *2.数组下标,让下标储存元素,出现一个让该数组下标的元素加1
package 位运算;

import java.util.Random;

import javax.rmi.CORBA.Util;



public class 按位异或求唯一成对的数字 {
/*
 * 异或^,用于比较两个二进制的相应位,按位异或是,如果二进制对应的的位
 * 1或0,则返回0,1^0=1,相当于二进制的加法,但是不进位
 * 1^1=0.0^0=0,1^0=1,任何数字和1异或都等于它本身
 */
	
	public static void main(String[] args) {
		int n=6;
		/*
		 * 题目描述:将1-5的数字放在容量为6的数组中,只有一个数字唯一成对
		 * 不用辅助空间,找出这个数字
		 */
		int []arr=new int[n];
		for(int i=0;i<arr.length-1;i++) {
			arr[i]=i+1;
		}
		int index=new Random().nextInt(n-1)+1;
		arr[arr.length-1]=index;
		
		for (int i : arr) {
			System.out.print(i+"\t");
		}
		System.out.println();
		int x=0;//0异或任何数字都为0
		for(int i=1;i<n;i++) {
			x^=i;
		}
		for(int i=0;i<n;i++) {
			x^=arr[i];
		}
		System.out.println(x);
		System.out.println("============");
		/*
		 * 原理:A^A=0,a^a^b^c^c=b
		 * 数组数字和1-5数字异或,有一个数字有三次出翔
		 * 最后会得出这个数字
		 */
		//辅助空间的解法,用下标
		int []hep=new int[n];//这个数组必须设置为n个元素,否则会出现数组越界问题
		for(int i=0;i<n;i++) {
			int x1=arr[i];
			hep[x1]++;
		}
	
		for(int i=0;i<n-1;i++) {
			if(hep[i]==2) System.out.println(hep[i]);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值