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