二进制以及位运算

简介: 深入了解二进制

目录

|、&、||、&&、^符号含义

|和&为计算机中二进制之间的位运算

||和&&为计算机中的逻辑运算符

^为计算机中的异或运算

Java中打印二进制

负数的二进制(即正数的补码)

基本概念

Java中的>>和>>>

如何找数组中唯一成对的那个数

二进制中1的个数

用一句整数判断一个整数是不是2的整数次方

将整数的奇偶位互换

二进制表示浮点实数

出现一次和出现k次


|、&、||、&&、^符号含义

|和&为计算机中二进制之间的位运算

在计算机中二进制的0表示false,1表示true。

|为位运算中的或运算:它的运算逻辑为一真则真,全假则假

&为位运算中的并运算:它的运算逻辑为一假则假,全真则真

||和&&为计算机中的逻辑运算符

||表示为或运算:它的运算逻辑为只要一个为true则结果为true

&&表示为并运算:它的运算逻辑为全为true时结果才为true,类似于and,只有两边结果都为true时,最后结果才为true

^为计算机中的异或运算

int x=1;

int y=2;

x^=y;//异或运算,相同为0不同为1。结果为3.

System.out.println("x="+ ++x);

二进制运算过程:

0 0 0 1

0 0 1 0

--------------

0 0 1 1

最后在执行++x,所以最后输出为4。

Java中打印二进制

1. import java.util.Scanner;
2. public class Main {
3. public static void main(String[] args) {
4. System.out.println("Java二进制-7: "+Integer.toBinaryString(7));
5. System.out.println("Java二进制-7: "+Integer.toBinaryString(-7));
6.     }
7. 
8. }

Java二进制-7: 111

Java二进制-7: 11111111111111111111111111111001

其他进制打印

1. public class Main {
2. 
3. public static void main(String[] args) {
4. System.out.println(Integer.toString(45,3));//45是十进制数,3是多少进制
5. 
6.     }
7. 
8. }

负数的二进制(即正数的补码)

先举个正确的例子:

7的二进制形式可以表示如下:

00000000 00000000 00000000 00000111

-7的二进制形式可以表示如下:

11111111 11111111 11111111 11111001

1)左边为高位,右边为低位;

2)最高位为符号位,正数的符号位为0,负数的符号位为1;

3)按照我们正常的逻辑很容易想到只需要把正数7的二进制形式的符号位换成1,-7的二进制表示形式应该是

10000000 00000000 00000000 00000111

但它只是一个原码,不是最终表示形式,所以是不对的;

4)在计算机中,负数以原码的补码形式表达。要想正确推出负数的二进制表示形式,需要先了解以下基本概念

基本概念

原码

一个正数,按照其本身大小转换成的二进制数,称为原码

一个负数,按照其绝对值大小转换成的二进制数,最高位补1,称为原码

比如:

1. 00000000 00000000 00000000 00000111 // 是7的原码
2. 10000000 00000000 00000000 00000111 // 是-7的原码

反码

正数的反码与原码相同

负数的反码为对该数的原码除符号位外各位取反

比如:

1. 00000000 00000000 00000000 00000111 // 是7的反码,和原码相同
2. 10000000 00000000 00000000 00000111 // 是-7的原码
3. 11111111 11111111 11111111 11111000 // 对-7的原码取反(除符号位),即得到了-7的反码
  • 1
  • 2
  • 3

补码

正数的补码与原码相同

负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1;即对负数的补码为对该数的反码的最后一位加1

比如:

1. 00000000 00000000 00000000 00000111 // 是7的补码,和原码相同
2. 10000000 00000000 00000000 00000111 // 是-7的原码
3. 11111111 11111111 11111111 11111000 // 对-7的原码取反(除符号位),即得到了-7的反码
4. 11111111 11111111 11111111 11111001 // 最后一位加1,即得到-7的补码,这也是负数在计算机中最终的表示形式

Java中的>>和>>>

'>>' 算术右移,向右移左边补符号位

'>>>' 逻辑右移,向右移左边补0

System.out.println("Java二进制-7: "+Integer.toBinaryString(-7));

System.out.println("-7>>2: "+Integer.toBinaryString(-7>>2));

System.out.println("-7>>>2: "+Integer.toBinaryString(-7>>>2));

输出:

Java二进制-7: 11111111111111111111111111111001

-7>>2: 11111111111111111111111111111110

-7>>>2: 111111111111111111111111111110 //正常应该这样(00)111111111111111111111111111110左边的两个0不显示

如何找数组中唯一成对的那个数

1. import java.sql.Array;
2. import java.util.Arrays;
3. import java.util.Random;
4. public class Main {
5. public static void main(String[] args) {
6. int N=11;
7. int[] arr=new int[N];
8. for(int i=0;i<arr.length-1;i++){
9.     arr[i]=i+1;
10. }
11. arr[arr.length-1]=new Random().nextInt(N-1)+1;
12. int index=new Random().nextInt(N);
13. int t=arr[arr.length-1];
14. arr[arr.length-1]=arr[index];
15. arr[index]=t;
16.         System.out.println(Arrays.toString(arr));
17. int x1=0;
18. for(int i=1;i<=N-1;i++){
19.     x1=(x1^i);
20. }
21. for(int i=0;i<N;i++){
22.     x1=x1^arr[i];
23. }
24.         System.out.println(x1);
25. 
26. 
27.     }
28. 
29. 
30. }

二进制中1的个数

1.

1. import java.util.Scanner;
2. public class Main {
3. public static void main(String[] args) {
4.        Scanner sc=new Scanner(System.in);
5. int N=sc.nextInt();
6.         System.out.println(Integer.toString(N,2));//打印几进制
7. int count=0;
8. for(int i=0;i<32;i++){
9. if((N&1<<i)==(1<<i)){
10.         count++;
11.     }
12. }
13. 
14.         System.out.println(count);
15. 
16. 
17.     }
18. 
19. 
20. }

2.

1. import java.util.Scanner;
2. public class Main {
3. public static void main(String[] args) {
4.        Scanner sc=new Scanner(System.in);
5. int N=sc.nextInt();
6.         System.out.println(Integer.toString(N,2));//打印几进制
7. int count=0;
8. while(N!=0){
9.     N=(N-1)&N;
10.     count++;
11. }
12. 
13. 
14.         System.out.println(count);
15. 
16. 
17.     }
18. 
19. 
20. }

3.

1. import java.util.Scanner;
2. public class Main {
3. 
4. 
5. public static void main(String[] args) {
6.        Scanner sc=new Scanner(System.in);
7. int n= sc.nextInt();
8. while(n-->0){
9. int k= sc.nextInt();
10. int cnt=0;
11. while(k!=0){
12.                k=k&(k-1);
13.                cnt++;
14. 
15.            }
16.            System.out.print(cnt);
17. if(n!=0) System.out.print(" ");
18. 
19.        }
20. 
21.     }
22. }

用一句整数判断一个整数是不是2的整数次方

1. import java.util.Scanner;
2. public class Main {
3. public static void main(String[] args) {
4.        Scanner sc=new Scanner(System.in);
5. int N=sc.nextInt();
6.         System.out.println(Integer.toString(N,2));//打印几进制
7. int count=0;
8. while(N!=0){
9.     N=(N-1)&N;
10.     count++;
11. }
12. if(count==1) System.out.println("yes");
13. else System.out.println("no");
14. 
15. //System.out.println(count);
16. 
17. 
18.     }
19. 
20. 
21. }

将整数的奇偶位互换

1. import java.util.Scanner;
2. 
3. public class Main {
4. 
5. 
6. public static void main(String[] args) {
7. 
8. //int a = 0b010000000_00000000_00000000_00000000; 测试边界是否满足
9.         Scanner sc=new Scanner(System.in);
10. int a = sc.nextInt();
11. 
12.         System.out.println("交换前整数:"+a);
13. 
14.         System.out.println("交换前整数二进制:"+Integer.toString(a,2));
15. 
16. int b = m(a);
17. 
18.         System.out.println("交换后整数:"+b);
19. 
20.         System.out.println("交换后整数二进制:"+Integer.toString(b,2));
21. 
22. 
23.     }
24. 
25. private static int m(int i) {
26. 
27. int ji = i & 0x55555555; //和0101 0101 0101 .。。。。 做与运算保留奇数位 相当于取出
28. 
29. 
30. int ou = i & 0xaaaaaaaa; //和1010 1010 1010 .。。。。 做与运算保留偶数位 相当于取出
31. 
32. return (ou>>1)^(ji<<1);
33. 
34.     }
35. 
36. }

二进制表示浮点实数

1. public class Main {
2. 
3.     public static void main(String[] args) {
4. 
5. double num = 0.625;
6. 
7.         StringBuilder sb = new StringBuilder("0.");
8. 
9. while(num>0){
10. 
11. // 乘2:挪整
12. 
13. double r = num * 2;
14. 
15. // 判断整数部分
16. 
17. if (r>=1) {
18. 
19.                 sb.append("1");
20. 
21. // 消除整数部分
22. 
23. num = r - 1;
24. 
25. 
26.             }else {
27. 
28.                 sb.append("0");
29. 
30. num = r;
31. 
32.             }
33. 
34. if (sb.length()>34) { // 这里的34包括“0.”长度
35. 
36.                 System.out.println("ERROR");
37. 
38. return ;
39. 
40.             }
41. 
42.         }
43. 
44.         System.out.println(sb.toString()); // 结果为0.101
45. 
46.     }
47. 
48. }

出现一次和出现k次

1. public class find1 {
2.  public static void main(String[] args) {
3.    // TODO Auto-generated method stub
4. 
5.    int[] arr={5,5,5,2,2,2,4,6,6,6};
6.    int len = arr.length;
7.    int [][] kRadix = new int[len+1][3];
8.    int k=0;
9. 
10.     //将2进制数转换成3进制数,存在2维数组中
11.     for(int i=0;i<len;i++)
12.     {
13.       for(int j=0;j<3;j++)
14.       {
15.         kRadix[i][j]=arr[i]%3;
16.         arr[i]/=3;
17.       }
18.     }
19. 
20.     //输出高低位反着的3进制数
21.     for(int i=0;i<len;i++)
22.     {
23.       for(int j=0;j<3;j++)
24.       {
25.         System.out.print(kRadix[i][j]);
26.       }
27.       System.out.println();
28.     }
29. 
30.     //进行不进位的加法
31.     for(int j=0;j<3;j++)
32.       {
33.         for(int i=0;i<len;i++)
34.         {
35.           kRadix[len][j]+=kRadix[i][j];
36.           kRadix[len][j]%=3;
37.         }
38.       }
39. 
40.     //将个数为1的数存放在最后一行二维数组中
41.       for(int j=0;j<3;j++)
42.         {
43.           System.out.print(kRadix[len][j]);
44.       k+=kRadix[len][j]*(int)(Math.pow(3,j));//将3进制数转换为10进制数
45.         }
46.        System.out.println();
47.           System.out.println("个数为一的数为:");
48.         System.out.print(k);
49.   }
50. }

   

相关文章
|
4月前
二进制和进制转换
二进制和进制转换
56 0
|
4月前
二进制的原码、补码和反码,以及八位二进制表示范围、常见位运算和进制转换
二进制的原码、补码和反码,以及八位二进制表示范围、常见位运算和进制转换
757 0
二进制的原码、补码和反码,以及八位二进制表示范围、常见位运算和进制转换
|
11月前
|
数据处理
二进制算术运算的介绍
二进制算术运算 引言: 二进制算术运算是计算机科学中的重要概念,它是计算机内部运算的基础。本文将介绍二进制算术运算的基本概念和常见的运算符,以及如何进行二进制数的加法、减法、乘法和除法运算。 一、二进制算术运算的基本概念 二进制数是由0和1组成的数,它是计算机中表示数据的基本形式。在二进制算术运算中,我们使用了一些基本的运算符,包括加法、减法、乘法和除法。这些运算符在二进制数中的运算规则与十进制数中的运算规则类似,但是需要注意的是,二进制数中没有负数的概念,所以减法运算需要借位。 二、二进制数的加法运算 二进制数的加法运算与十进制数的加法运算类似,只需要按照从右到左的顺序逐位相加,并考虑
139 1
|
存储 IDE Java
二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
160 1
二进制浮点数的加减法运算
二进制浮点数的加减法运算
|
Python
一日一技:二进制减法是如何进行的
一日一技:二进制减法是如何进行的
124 0
二进制数的补码及运算(2)
二进制数的补码及运算(2)
177 0
二进制数的补码及运算(2)
二进制加法
二进制加法:目标只使用位运算符来实现,还有缺陷,留待后续解决
68 0
|
JavaScript 前端开发 数据安全/隐私保护
进制转换以及位运算
进制转换以及位运算
149 0
进制转换以及位运算
二进制数的补码及运算(1)
二进制数的补码及运算(1)
222 0