位运算
&(与)、| (或)、^(异或)、~ (非/取反)
判断奇偶数 x&1=1为奇数 =0为偶数 原因:奇数最后一位是1,&1后为1,偶数最后一位为0,&1后为0
1.将整数的二进制奇偶位互换
package 蓝桥杯算法; import java.util.Scanner; /** * 例如 1001 变为0110 * 1001&1010=1000保留偶数位 * 1001&0101=0001保留奇数位 * 偶数位右移 >> 0100 * 奇数位左移 >> 0010 * 两者异或 0100^0010=0110 * 可得结果 * */ public class 将整数的二进制奇偶位互换 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); System.out.println(Integer.toBinaryString(N)); int ou=N&0xaaaaaaaa;//和1010 1010 ...做与运算得到偶位 int ji=N&0x55555555;//和0101 0101 ...做与运算得到奇位 N=(ou>>1)^(ji<<1); System.out.println(Integer.toBinaryString(N)); } }

2.找出唯一成对的数
package 蓝桥杯算法; import java.util.Arrays; import java.util.Random; /** * 由于A^A=0 * A^0=A * 所以在数组中的所有数进行^可以消去相同的数 结果为奇数个数的那个数据 * 例如: 1^1^2^2^3=3 * 所以找唯一成对的数可以写两个循环 * 第一个循环对在该范围的数据进行^ * 第二个循环利用第一个循环的结果对该数组中的数据进行^ * 得到的结果就是唯一成对的数 因为这样成对的数据异或了三次 */ public class 找出唯一成对的数 { public static void main(String[] args) { int N=100; int[] arr=new int[N]; for (int i = 0; i <arr.length-1 ; i++) { arr[i]=i+1; } arr[N-1]=new Random().nextInt(N-1)+1; int index=new Random().nextInt(N); int t; t=arr[N-1]; arr[N-1]=arr[index]; arr[index]=t; System.out.println(Arrays.toString(arr)); int x=0; for (int i = 0; i <N-1 ; i++) { x=x^(i+1); } for (int i = 0; i <N ; i++) { x^=arr[i]; } // x^x=0,出现两次的消去,剩下出现三次的 System.out.println(x); // 辅助空间方法 int[] h=new int[N]; for (int i = 0; i <N ; i++) { h[arr[i]]++; } for (int i = 0; i < N; i++) { if(h[i]==2){ System.out.println(i); } } } }
3.二进制中1的个数
package 蓝桥杯算法; import java.util.Scanner; public class 二进制中1的个数 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); System.out.println(Integer.toString(N, 2)); int count = 0; /** * 第一种解法 * int类型是32位 利用移位操作 * N与 1 10 100 1000 ....做&运算 的结果如果等于1<<i位后的结果则计数 * 就比如:N假设为1001 * 10001&00001 == 00001 相等 则计数 说明该位置为1 * ........... * 10001&10000 == 10000 说明该位置为1 * 相等的次数即为1的个数 * * 当然这种是1进行左移操作, 也可以利用N来进行右移与1进行&操作进行判断1的个数 * */ for (int i = 0; i < 32; i++) { if ((N & (1 << i)) == 1 << i) { count++; } } System.out.println(count); /** * 另一种解法 * 这种解法的思想就是,把N中的每个一干掉,最后当N为0的时候 干掉1的次数也就是N中1的个数 * 例如 1100 * 1100-1=1001然后与1100做&运算 低位的1就被干掉了 N变为1000 * 1000-1=0111 然后与1000做&运算 N变为0 由此可见1的个数为2 * 干掉1的次数也就是1的个数 * */ count = 0; while (N != 0) { N = (N - 1) & N; count++; } System.out.println(count); } }
4.一个整数是不是2的整数次方
package 蓝桥杯算法; import java.util.Scanner; //2的整数次方 也就是说对应二进制位上只有一个是1 其他全为0 即1的个数为1 public class 一个整数是不是2的整数次方 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); if((N&(N-1))==0) System.out.println("YES"); else System.out.println("NO"); } }
本文来自博客园,作者:guoyuxin3,转载请注明原文链接:https://www.cnblogs.com/guoyuxin3/p/15110384.html

浙公网安备 33010602011771号