一:按位与&
与运算&,
*规则,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]);
}
}
}