首页 > 编程语言 >JavaSE——进制转换、原码、反码、补码、位运算(左移、右移、取反)

JavaSE——进制转换、原码、反码、补码、位运算(左移、右移、取反)

时间:2024-09-30 23:21:36浏览次数:3  
标签:右移 十六进制 二进制 补码 取反 八进制 十进制 原码

目录

一、四种进制介绍

二、进制的转换 

(一)二进制—>十进制

(二)八进制—>十进制

(三)十六进制—>十进制

(四)十进制—>二进制

(五)十进制—>八进制

(六)十进制—>十六进制

(七)二进制—>八进制

(八)二进制—>十六进制

(九)八进制—>二进制

(十)十六进制—>二进制

三、原码、反码、补码

(一)原码

(二)反码

(三)补码

四、位运算

1.按位与 &

2.按位或 |  

3. 异或 ^

4.左移 <<

5. 右移 >>

6.无符号右移 >>>

7. 取反 ~


一、四种进制介绍

对于整数,有四种表示方式:

  1. 二进制(BIN):0,1,满2进1,以0b或0B开头。
  2. 十进制(OCT):0-9,满10进1。
  3. 八进制(DEC):0-7,满8进1,以数字0开头表示。
  4. 十六进制(HEX):0-9及A(10)、B(11)、C(12)、D(13)、E(14)、F(15),满16进1,以0x或0X开头表示。此处的A-F不区分大小写。
public static void main(String[] args) {
    // 二进制
    int n1 = 0b1010;
    // 十进制
    int n2 = 1010;
    // 八进制
    int n3 = 01010;
    // 十六进制
    int n4 = 0x10101;
    System.out.println("n1=" + n1); // n1=10
    System.out.println("n2=" + n2); // n2=1010
    System.out.println("n3=" + n3); // n3=520
    System.out.println("n4=" + n4); // n4=65793
}

 进制的图示:

二、进制的转换 

(一)二进制—>十进制

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。

案例:0b1011转为十进制。

0b1011  =1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11

(二)八进制—>十进制

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。

案例:0234转成十进制。

0234=4*8^0 + 3*8^1 + 2*8^2 + 0*8^3 = 4 + 24 + 128 = 156

(三)十六进制—>十进制

规则:从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。

案例:0x23A转为十进制。

23A=10*16^0 + 3*16^1 + 2*16^2 = 10 + 48 + 512 = 570

小练习:将0b110001100、02456、0xA45分别转成十进制

0b110001100 = 0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 0*2^4 + 0*2^5 + 0*2^6 + 1*2^7 + 1*2^8

                        = 4+8+128+256=396

02456=6*8^0 + 5*8^1 + 4*8^2 + 2*8^3 = 6+40+256+1024 = 1326

A45 = 5*16^0 + 4*16^1 + 10*16^2 = 5 + 64 + 2560 = 2629

(四)十进制—>二进制

规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。

案例:34转为二进制。

一个字节有8位,100010是6位,不够8位,前面需要用0补位,所以最终结果:0B00100010

(五)十进制—>八进制

规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。

案例:131转为八进制

因为八进制是0开头,所以要在203前面补上0,结果为0203

(六)十进制—>十六进制

规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。

案例:237转为十六进制

因为十六进制是0x开头的,所以结果为0xED

小练习:

123转成二进制=0b01111011

678转成八进制=01246

8912转成十六进制=0x22D0

(七)二进制—>八进制

规则:从低位开始,将二进制数每三位一组,最高位不足三位,补0。三位以内,按照二进制转十进制的转换规则进行运算。产生的八进制数字按顺序排列

案例:0b11010101转成八进制。

011010101  => 011是3  010是2   101是5   =>八进制为:0325

(八)二进制—>十六进制

规则:从低位次起,每四位看作一组,产生一个十六进制数字,最高位不足四位,补0。四位以内,按照二进制转十进制的转换规则进行运算。产生的十六进制数字按顺序排列。

案例:0b11010101

11010101  => 1101是13  0101是5  => 十六进制为:0xD5

小练习:

0b11100101转成八进制=>0345

0b1110010110转成十六进制=>0x396

(九)八进制—>二进制

规则:将八进制数每1位,转成对应的一个3位的二进制数即可。

案例:0237转成二进制。

02(010)3(011)7(111) = 0b010011111 = 0b10011111

(十)十六进制—>二进制

规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。

案例:0x23B转为二进制

0x2(0010)3(0011)B(1011) =0b001000111011

小练习:

01230转成二进制                01(001)2(010)3(011)0(000) => 0b001010011000

0xAB29转成二进制              A(1010)B(1011)2(0010)9(1001) => 0b1010101100101001

三、原码、反码、补码

二进制在运算中的说明

  1. 二进制是逢2进位的进位制,0、1是基本运算符。
  2. 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。

(一)原码

所有的数据在底层都是二进制数据的补码形式存储的

一个数字分为符号位和数值位,1代表负数,0代表正数,符号位在最高位

对于正数来说,原码反码和补码都一样

符号位数值位
-510000101
500000101

(二)反码

负数的反码是在原码的基础上符号位不变,其他位按位取反

符号位数值位
-511111010
500000101

(三)补码

负数的补码是在反码基础上加1

符号位数值位
-511111011
500000101

四、位运算

前提:要把数据转换成二进制数据的补码形式进行运算

位运算是更底层的运算符,效率更高。

1.按位与 &

按位与 &:两个操作数中都是1,结果是1,否则结果是0

  • 任意一个数&一个偶数,结果一定是偶数

  • 任意一个数&1,如果结果是0,就是一个偶数

int a = 10;
if((a & 1) == 0){
    System.out.println("偶数"); // 偶数
}

2.按位或 |  

按位或 | :两个位中只要有一个是1,那么结果就是1,否则就是0

  • 任意一个数 | 一个奇数,结果一定是奇数

  • 任意一个数与0或,结果还是自身

3. 异或 ^

异或 ^:两个操作数中,相同结果是0,不同结果是1

  • 任何数异或自己都是0,异或0都是自身

int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;// b = a ^ b ^ b;  b = a
a = a ^ b;// a = a ^ b ^ a   a = b
System.out.println(a);
System.out.println(b);

4.左移 <<

左移 << :左边的丢弃,右边补0。左移n位就是乘以2的n次方

3 << 2     相当于3*2的2次方=12
    0000 0011
   00 001100

5. 右移 >>

右移 >> :右边丢弃,左边补位(正数补0,负数补1) 对于正数来说,右移n位就是除以2的n次方 

5 >> 2 		相当于5除以2的2次方=1
       0000 0101
	     000000 01

6.无符号右移 >>>

无符号右移 >>> :和右移类似,但是最高位永远是补0

7. 取反 ~

取反 ~ :结论: ~i = -i - 1

~3  0000 0011
    1111 1100
    - 128 + + 60 + 64

练习:-5 >> 2

一定要注意:要把数据转换成二进制数据的补码形式进行运算!!!

原码:1000 0101
反码:1111 1010
补码:1111 1011
 右移2位后的补码    111111 10
反码 1111 1101
原码 1000 0010  -2

结果为:-2

标签:右移,十六进制,二进制,补码,取反,八进制,十进制,原码
From: https://blog.csdn.net/Helen_1997_1997/article/details/142517285

相关文章

  • 原码、反码和补码的概念
    错题考的知识点是计算机中数值的表示方式,特别是原码、反码和补码的概念。原码原码是计算机中表示整数的一种方式,它是直接将数字转换为二进制数,其中最高位作为符号位,0表示正数,1表示负数,其余位表示数值。例如,对于8位二进制数:正数的原码:第一位是0,后面跟数字的二进制表示。负数的......
  • Java的原码、反码和补码
    在Java中,原码、反码和补码是用来表示整数的三种不同的编码方式。这三种编码方式分别用来表示正数、负数以及0。原码:原码是整数的最基本的表示方式,它直接将整数的二进制表示出来。原码的表示方法是,最高位表示符号位(0表示正数,1表示负数),其余位表示整数的绝对值的二进制表示。......
  • 动手动脑——原码,反码,补码
    在计算机科学中,原码、反码和补码是数字在计算机内部表示的一种方式,主要用于二进制数的运算,特别是负数的表示和运算。原码:原码是最直接的二进制表示方法,其中最高位是符号位,0表示正数,1表示负数。剩下的位表示数值的大小。例如,十进制数5的原码表示为:00000101(假设使用5位二进制数......
  • 原码 补码 反码
    #include<iostream>usingnamespacestd;intmain(){inta;cin>>a;intzi[a];for(inti=0;i<a;i++){cin>>zi[i];}if(zi[0]==0){for(inti=0;i<a;i++){cout<<zi[i];......
  • 9月26日原码,补码,反码知识点
    首先是这三码的区别,对于正数来讲三者没有什么区别,区别在于负数反码:原码中除去符号位,其他的数值位按位取反,即0变1,1变0补码:反码+1示例显而易见的对于正数没有区别。那么设计这三个码的意义是什么?上面介绍了原码、反码和补码三者的概念,那么,计算机中为什么要设计补码这一概念呢?因......
  • 成都仪器定制-二进制补码及与原码的互相转换方法
    大沙把一些基础的知识说清楚,本文介绍二进制补码及与原码的转换方法。先说原码,原码‌是一种计算机中对数字的二进制定点表示方法。在原码表示法中,数值前面增加了一位符号位,最高位为符号位,0表示正数,1表示负数。其余位表示数值的大小。二进制补码‌是一种用于表示有符号整数的二进......
  • 整数在内存中的存储&&原码反码补码
    目录1.整数在内存中以二进制的形式存在1.1(正数存储情况)1.2负数存储情况1.3整数的补码如何得到原码2.无符号整数的原反补码 小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化! 1.整数在内存中以二进制的形式存在1.1(正数存储情况)比如说数字2......
  • 认识原码反码补码
    目录一.何为原码反码和补码?(1)原码(2)反码(3)补码(4)总结二.原反补之间的简单计算(1)补码加法(2) 补码减法(3) 溢出问题一.何为原码反码和补码?(1)原码原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。符号位:最高位(最左边的位)用于表示符号,0......
  • 信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned 关键字、二进制、位
    信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned关键字、二进制、位运算、左移、右移、异或运算PDF文档公众号回复关键字:202409132023CSP-S阅读程序1判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>......
  • 贪心算法day28|买卖股票的最佳时机、55. 跳跃游戏、1005. K 次取反后最大化的数组和
    贪心算法day28|买卖股票的最佳时机、55.跳跃游戏、1005.K次取反后最大化的数组和122.买卖股票的最佳时机II55.跳跃游戏1005.K次取反后最大化的数组和122.买卖股票的最佳时机II给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一......