2022/4/8回顾算法入门第一章位运算的回顾。

简介: 2022/4/8回顾算法入门第一章位运算的回顾。

第一章位运算的定义程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,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;
  }
}


位运算是真的好玩。

相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
3月前
|
算法
【算法】位运算算法——消失的两个数字(困难)
【算法】位运算算法——消失的两个数字(困难)
|
3月前
|
算法
【算法】位运算算法——只出现一次的数字Ⅱ
【算法】位运算算法——只出现一次的数字Ⅱ
|
3月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
1月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
3月前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
182 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
3月前
|
算法
【算法】位运算算法——两整数之和
【算法】位运算算法——两整数之和