第一章位运算的定义程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)
第一题:找出唯一成对的那个数.
package 第一章位运算知识讲解; /** * 找出唯一成对的那个数 * @author MZFAITHDREAM * */ public class DemoTest1 { public static void main(String[] args) { int num=1001; int [] arr= new int [num]; for (int i = 0; i < num; i++) { arr[i]=i+1; } arr[num-1]=(int)Math.random()*(num-1)+1; swap(arr,num-1,(int)Math.random()*(num-1)); int x=0; for (int i = 0; i < arr.length; i++) { x=x^i; } for (int i = 0; i < arr.length; i++) { x=x^arr[i]; } System.out.println(x); } private static void swap(int[] arr, int i, int j) { // TODO Auto-generated method stub int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } }
第二题找出落单的那个数。
package 第一章位运算知识讲解; /** * 找出落单的那个数 * @author MZFAITHDREAM * */ public class DemoTest2 { public static void main(String[] args) { //俩个数字相同为0 int[]a={1,1,2,2,3,3,4,5,5,6,6}; int x=0; for (int i : a) { x=x^i; } System.out.println("输出结果为落单的那个数"); System.out.println(x); } }
第三题找出二进制中为1的个数。
package 第一章位运算知识讲解; import java.util.Scanner; import WEB3331.DemoTest4; /** * 找出二进制中为1的个数 * @author MZFAITHDREAM * */ public class DemoTest3 { public int init(int n) { // 定义一个变量用于计数为1 int res=0; // while循环 while(n!=0) { res+=n&1; n>>>=1; } return res; } public static void main(String[] args) { try (// System.out.println("输入内容"); Scanner sc = new Scanner(System.in)) { int n=sc.nextInt(); int ss =new DemoTest4().init(n); System.out.println("打印出一的个数:"+ss); } } }
第四题给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
package 第一章位运算知识讲解; public class DemoTest4 { public int singleNumber(int[] nums) { int x=0; for (int i : nums) { x=x^i; } //System.out.println(x); return x; } }
第五题颠倒给定的 32 位无符号整数的二进制位。
package 第一章位运算知识讲解; import java.util.Scanner; /** * 颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。 示例 1: 输入:n = 00000010100101000001111010011100 输出:964176192 (00111001011110000010100101000000) 解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。 示例 2: 输入:n = 11111111111111111111111111111101 输出:3221225471 (10111111111111111111111111111111) 解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293, 因此返回 3221225471 其二进制表示形式为 101111111111111111111111111 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-bits 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * @author MZFAITHDREAM * */ /** * //颠倒给定的 32 位无符号整数的二进制位。 * @author MZFAITHDREAM * */ public class DemoTest5 { public int reverseBits(int n) { // 定义一个变量 int rev = 0; // 采用for循环 for (int i = 0; i < 32 && n != 0; ++i) { rev |= (n & 1) << (31 - i); n >>>= 1; } return rev; } public static void main(String[] args) { try (// 用户输入内容 Scanner sc = new Scanner(System.in)) { int n=sc.nextInt(); new DemoTest5().reverseBits(n); } } }
第六题编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
package 第一章位运算知识讲解; import java.util.Scanner; import WEB3331.DemoTest4; /** * 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。 示例 1: 输入:00000000000000000000000000001011 输出:3 解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。 示例 2: 输入:00000000000000000000000010000000 输出:1 解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。 示例 3: 输入:11111111111111111111111111111101 输出:31 解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-of-1-bits 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * @author MZFAITHDREAM * */ public class DemoTest6 { public int init(int n) { // 定义一个变量用于计数为1 int res=0; // while循环 while(n!=0) { res+=n&1; n>>>=1; } return res; } public static void main(String[] args) { try (// System.out.println("输入内容"); Scanner sc = new Scanner(System.in)) { int n=sc.nextInt(); int ss =new DemoTest4().init(n); System.out.println("打印出一的个数:"+ss); } } }
第七题:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
package 第一章位运算知识讲解; import java.util.Scanner; /** * 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n = 1 输出:true 解释:20 = 1 示例 2: 输入:n = 16 输出:true 解释:24 = 16 示例 3: 输入:n = 3 输出:false 示例 4: 输入:n = 4 输出:true 示例 5: 输入:n = 5 输出:false 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/power-of-two 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * @author MZFAITHDREAM * */ public class DemoTest7 { /** * 定义方法实现 * @param n * @return */ public boolean isPowerOfTwo(int n) { return n > 0 && (n & -n) == n; } }
位运算是真的好玩。