位运算的小技巧

简介: 快速学习位运算的小技巧

一:按位与&

与运算&,

 *规则,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]);
    }
  }
}
相关文章
|
6月前
玩转位运算
玩转位运算
|
存储 Java
一篇搞定位运算(&、|、^、~、>>、<<、>>>)
我们最了解的就是十进制 , 除了十进制 , 还有二进制 , 六进制 , 八进制等等 , 由于位运算操作就是二进制 , 所以我们主要来说一下二进制 , 十进制的个位有(0~9)这几个数字 , 而二进制也相同 , 二进制的个位上只有0和1
58 0
|
5月前
|
编译器 Linux C++
详细解读C++中的位运算总结
详细解读C++中的位运算总结
35 0
|
6月前
|
C++
位运算
位运算“【5月更文挑战第23天】”
40 1
|
5月前
|
机器学习/深度学习
常见位运算的总结
常见位运算的总结
49 0
|
算法 Java 编译器
第 13 天_位运算
第 13 天_位运算
90 0
位运算专题(个人理解)
位运算专题(个人理解)
72 0
|
算法 数据安全/隐私保护
基本的位运算
基本的位运算
|
算法
位运算能做什么
位运算能做什么
54 0
|
存储
位运算及A+B
位运算及A+B