进制转换、 原码、反码、补码、位运算符

本文介绍了计算机中进制转换的方法,包括十进制与其他进制之间的转换,以及二进制转八进制、十六进制的规则。同时,详细阐述了原码、反码、补码的概念和计算规则,特别强调了Java中数据的存储方式。此外,还讲解了位运算符的使用,如按位与、按位或、按位异或、按位取反以及位移运算符的运算规则。最后,简要提到了Java中Scanner类用于键盘输入的基本操作。

十进制转其他进制

  1. 转换的原因:计算机中不同的场景下运算和存储会使用不同的进制,底层是二进制,Unicode就是一个十六进制
  2. 转换的方式:除基倒余法(辗转相除法)--转几进制就除以几
class Demo04 {
	public static void main(String[] args) {
		/*
			56转为二进制
			转几进制就除以几
			56 / 2 = 28...0
			28 / 2 = 14...0
			14 / 2 = 7 ...0
			7  / 2 = 3 ...1
			3  / 2 = 1 ...1
			1
			二进制的结果就是将所有的余数倒着写 0b111000
		
			69转为八进制
			69 / 8 = 8...5
			8  / 8 = 1...0
			1
			结果为105

			100转为十六进制
			100 / 16 = 6...4
			6
			结果就是64
		*/
		System.out.println(0b111000);
		System.out.println(0105);
		System.out.println(0x64);
	}
}

 二进制转其他进制

  1. 二进制转八进制:从右往左,三位一组,不够高位补0,将三位转为对应的十进制数字
  2. 二进制转十六进制:从右往左,四位一组,不够高位补0  将四位转为对应的十进制数字
  3. 二进制转十进制:从左往右一位一组求和
class Demo06 {
	public static void main(String[] args) {
		/*
			0b101011011011010110
			转为八进制  从右往左三位一组
			101 011 011 011 010 110
			5    3  3   3    2  6
			0533326

			转为十六进制 四位一组
			0010 1011 0110 1101 0110
			2	 11   6    13   6
			0x2b6d6
		*/
		System.out.println(0533326);
		System.out.println(0b101011011011010110);
		System.out.println(0x2b6d6);
	}
}

 其他进制转二进制

  1. 八进制转二进制:将每一位八进制数据转换成对应的三位二进制数,组合起来
  2. 十六进制转二进制:将每一位十六进制数据转换成对应的四位二进制数,组合起来
class Deom07 {
	public static void main(String[] args) {
		/*
			八进制 501
			转为二进制,将每一位八进制数拆为三维对应的二进制
			5	0	1
			101 000 001
			0b101000001


			十六进制转二进制
			0x60a1

			6		0		a		1
			0110	0000    1010	0001
			0b110000010100001


			十六进制转八进制
			先转二   
			0b110000010100001
			二转八
			110 000 010 100 001
			60241
		*/
		System.out.println(0b110000010100001);
		System.out.println(0x60a1);
		System.out.println(060241);
	}
}

 原码、反码、补码

 1.计算机中的数据,分为无符号数据和有符号数据,java语言都是有符号位的,十进制数和小数在计算机中都是以二进制形式存储的,而且存储有符号的数据,都是存储相应的补码

2.java中有符号的表示规则

          (1) 符号 : 0  正    1   负  放在数值最高位

                (1)原码:数值的二进制表示,但是会有加法和减法,但是在CPU内部使用的都是加法

                (2)以字节为例  0111 1111 +127  1111 1111 -127

                (3) 有两个特殊的值  0000 0000 表示0 1000 0000 -128

3.  原码、反码、补码计算规则

         (1)原码:最高位表示数据符号,其他位数表示数值,其实就是二进制码本身

         (2)反码:正数的原码和反码一致,负数的反码是由原码符号位不变,其余按位取反

         (3)补码:正数原码和补码一致,负数的补码由原码符号位不变,其余按位取反,末位加一

class Demo09 {
	public static void main(String[] args) {
		/*
			计算机中的运算都是以补码的形式进行的
			计算1-1
			1 + (-1)

			1的原码:0000 0001
			1的补码:0000 0001  正数的原反补全部一致

		   -1的原码:1000 0001 
		   -1的反码:1111 1110  符号位不变,其余按位取反
		   -1的补码:1111 1111  反码+1 就是补码

		   运算的时候,是对应的补码进行求和
		   -1的补码:1111 1111
		    1的补码:0000 0001
		   结果补码:1 0000 0000 字节运算  最高位溢出  舍弃
				    0000 0000 结果为0


			5 - 3
			-3的原码:1000 0011
			-3的反码:1111 1100
			-3的补码:1111 1101
			 5的补码:0000 0101
			   结果 :1 0000 0010 最高位溢出 舍弃
			         0000 0010 结果的补码

			-3 - 1
			-3的补码:1111 1101
			-1的补码:1111 1111
				    11111 1100  最高位溢出 舍弃
			结果补码:1111 1100 补码和补码之间运算的结果都是补码
			结果反码:1111 1011 补码-1就是反码
			结果原码:1000 0100  结果-4

		*/
	}
}

 位运算符

  1. 位运算,主要按照每个二进制位进行运算,其操作数和运算结果都是整数类型,只能对byte、short、char、int、long做运算
  2. Java语言中位运算符: 位逻辑运算符和位移运算符
  3. 分类:

符号 名称

& 与

| 或

~ 非

^ 异或

<< 左位移

>> 右位移

>>>   无符号右移

按位&

1.补码按位逐位相与,全1为1,遇0为0     1代表真   0代表假

低位对其,高位不足补0

按位|

1.补码按位逐位相或,全0为0,遇1为1     1代表真   0代表假

低位对其,高位不足补0

 

class Demo10 {
	public static void main(String[] args) {
		/*
			4 & 5
			0000 0100
			0000 0101 
			0000 0100 全1为1否则为0

			4 | 5
			0000 0100
			0000 0101
			0000 0101  

			-3 & -4
			-3的原码:1000 0011
			-3的反码:1111 1100
			-3的补码:1111 1101
			-4的补码:1111 1100
			   &运算:1111 1100 结果补码
			         1111 1011 结果反码
					 1000 0100 结果原码
			-3的补码:1111 1101
			-4的补码:1111 1100
				|    1111 1101 结果补码  -3的补码


			-9 & 3
			-9原码:1000 1001
			-9反码:1111 0110
			-9补码:1111 0111 
			 3补码:0000 0011
				| :1111 0111 补码 结果-9的补码
			    & :0000 0011 结果3	
		*/
	}
}

按位异或^

  1. 补码逐位异或,相同为0,不同为1 , 高位补0,低位对齐
class Demo12 {
	public static void main(String[] args) {
		/*
			4 ^ 5
			100
			101
			001 结果1

			4 ^ 10
			0100
			1010
			1110 结果14

			4^-5
			-5的补码:1111 1010
			 4的补码:0000 0100
			         1111 1110 结果补码
					 1111 1101 结果反码
					 1000 0010 结果源码  -2
			

	
		*/
	}
}

 按位取反~

  1. 对一个操作数进行运算,补码按位逐一取反,1变0,0变1
class Demo12 {
	public static void main(String[] args) {
		/*
			~11

			0000 1011
			1111 0100  结果补码所有的数据位都是0变1  1变0
			1111 0011
			1000 1100 结果-12


			~8 
			0000 1000
			1111 0111

			-8
			1000 1000
			1111 0111
			1111 1000
			0000 0111 结果是7

		*/
	}
}

位移运算符

<< :按位左移,补码按位左移,高位舍弃,低位补0,移动一位扩大二倍

>> :按位右移 :最高位补符号位,低位舍弃,右移一位,可以看作缩小为原来的二分之一

注意:

(1)正数右移的结果和除以2一致

  (2) 负数可能不一致,负数移动后的结果还是补码,需要进行还原

>>>: 无符号右移,只能操作正数

class Demo13 {
	public static void main(String[] args) {
		/*
			4 << 1 左位移
			0000 0100  高位舍弃低位补0
			000 01000 结果就是8

			-4 << 1
			1111 1100
			111 11000 结果补码 -8

			-4 >> 1
			1111 1100
			11111 110 结果是-2的补码

			-4 >> 2
			111111 11  结果是-1的补码

			-4 >> 4 
			1111 1111 结果还是-1
			是负数的情况,右移最终的结果最大就是-1 无论右移多少位最终就是-1

			-3 >> 1
			1111 1101
			11111 110 结果是-2的补码

			如果右移的负数 是奇数,就相当于将该数除以2,再减去1
			

			无符号右移和正常的右移规则一致,只是只能操作正数
		
		*/
	}
}

键盘录入Scanner

  1. Scanner是jdk提供给我们的一个类,是已经定义好的,只需要知道功能是怎么用就可以
  2. Scanner类是JDK中的java.util包下的类
  3. 作用:再程序运行的过程中,可以使用Scanner类来获取从键盘录入的数据,提高数据来源的灵活性
  4. 只有Java.lang包下的类,不需要导包,使用其他包下的类都需要导包
  5. 使用步骤:
    1. 导包:
      • 目的:为了让JVM定位到Scanner类型所在的具体位置
      • 导入方式:在类的声明上方,使用关键字import表示导入
      • import java.util.Scanner;
    2. 创建键盘录入对象:
      • Scanner sc = new Scanner(System.in);
    3. 调用sc对象的nextInt();方法获取键盘录入的一个整数
      • int x = sc.nextInt();
    4. 使用x完成运算

键盘录入一段字符串

1、Scanner下的另一个功能 next() 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值