十进制转其他进制
- 转换的原因:计算机中不同的场景下运算和存储会使用不同的进制,底层是二进制,Unicode就是一个十六进制
- 转换的方式:除基倒余法(辗转相除法)--转几进制就除以几
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);
}
}
二进制转其他进制
- 二进制转八进制:从右往左,三位一组,不够高位补0,将三位转为对应的十进制数字
- 二进制转十六进制:从右往左,四位一组,不够高位补0 将四位转为对应的十进制数字
- 二进制转十进制:从左往右一位一组求和
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);
}
}
其他进制转二进制
- 八进制转二进制:将每一位八进制数据转换成对应的三位二进制数,组合起来
- 十六进制转二进制:将每一位十六进制数据转换成对应的四位二进制数,组合起来
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
*/
}
}
位运算符
- 位运算,主要按照每个二进制位进行运算,其操作数和运算结果都是整数类型,只能对byte、short、char、int、long做运算
- Java语言中位运算符: 位逻辑运算符和位移运算符
- 分类:
符号 名称
& 与
| 或
~ 非
^ 异或
<< 左位移
>> 右位移
>>> 无符号右移
按位&
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
*/
}
}
按位异或^
- 补码逐位异或,相同为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变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
- Scanner是jdk提供给我们的一个类,是已经定义好的,只需要知道功能是怎么用就可以
- Scanner类是JDK中的java.util包下的类
- 作用:再程序运行的过程中,可以使用Scanner类来获取从键盘录入的数据,提高数据来源的灵活性
- 只有Java.lang包下的类,不需要导包,使用其他包下的类都需要导包
- 使用步骤:
- 导包:
- 目的:为了让JVM定位到Scanner类型所在的具体位置
- 导入方式:在类的声明上方,使用关键字import表示导入
- import java.util.Scanner;
- 创建键盘录入对象:
- Scanner sc = new Scanner(System.in);
- 调用sc对象的nextInt();方法获取键盘录入的一个整数
- int x = sc.nextInt();
- 使用x完成运算
本文介绍了计算机中进制转换的方法,包括十进制与其他进制之间的转换,以及二进制转八进制、十六进制的规则。同时,详细阐述了原码、反码、补码的概念和计算规则,特别强调了Java中数据的存储方式。此外,还讲解了位运算符的使用,如按位与、按位或、按位异或、按位取反以及位移运算符的运算规则。最后,简要提到了Java中Scanner类用于键盘输入的基本操作。

141

被折叠的 条评论
为什么被折叠?



