栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java—进制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java—进制

进制 1. 简介

进制就是进位计数制,是一种带进位的计数方法,即逢几进一。

生活中的进制:十进制(0~9)、七进制(星期)、十二进制(12小时制时间)、二十四进制(24小时制时间)、六十进制(分、秒)、二进制(1公斤=2斤)、十六进制(古代的1斤等于16两,即半斤八两)。

2. 常用进制
进制种类单词范围引导符号实例
十进制decimal由0~9组成,共10个,逢十进一无(Java中数字默认为十进制)10
二进制binary由0和1组成,共2个,逢二进一0b或0B0b10
八进制octonary由0~7组成,共8个,逢八进一0010
十六进制hex由0~9、a-f或A-F组成,共16个,逢十六进一0x或0X0x10

代码:

javase/src/code02/Test07.java:

package code02;

public class Test07 {
    public static void main(String[] args) {
        
        int a = 10;
        int b = 0b10; // 二进制以0B开头
        int c = 010; // 八进制以0开头
        int d = 0x10; // 十六进制以0x开头

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);

        
        // 输出八进制和十六进制:使用"进制转义符 + System.out.printf"(不能使用"System.out.println",否则会报错)
        System.out.printf("%o", d); // %o为八进制转义符,d表示要输出的值
        System.out.println();
        System.out.printf("%xn", c); // %x为十六进制转义符,n表示换行,c表示要输出的值
        System.out.printf("%o,%dn", d, c); // 可以同时使用多个进制转义符,"进制转义符"和"要输出的值"从左至右依次匹配
        // System.out.printf("%o,%d", c); // 必须为每个进制转义符都指定一个"要输出的值",否则程序运行时会报错

        // 输出二进制:使用"Integer.toBinaryString(x)",x为要输出的值
        System.out.println(Integer.toBinaryString(b)); // 暂时记住该代码
    }
}

java执行结果:

3. 进制转换

十进制转换为其他进制:除基取余,如十进制数转换为二进制:

其他进制转换为十进制:按权相加,如:

4. 二进制

计算机最底层使用的是二进制,所以数据在计算机最底层都是以二进制形式保存的。

二进制数分为两种:

  • 无符号二进制,只能存储正整数。

  • 有符号二进制,可以存储正数和负数,最高位(最左边)为符号位,0表示正数,1表示负数,如:

    正数5表示为:00000000 00000000 00000000 00000101。

    负数-5表示为:10000000 00000000 00000000 00000101。

二进制中的原码、补码、反码:

  • 原码

    原始二进制值。

  • 反码

    正数:反码和原码相同,如5的原码为:00000000 00000000 00000000 00000101,反码仍为00000000 00000000 00000000 00000101。

    负数:符号位不变,其余各位取反,如-5的原码为:10000000 00000000 00000000 00000101,反码为11111111 11111111 11111111 11111010。

  • 补码

    正数:补码和原码相同。

    负数:反码+1,如-5的补码:11111111 11111111 11111111 11111011。

总结:

  • 对于正数,原码、补码、反码都相同。

  • 对于负数有所不同。

计算机内部都是用补码来存储和表示值的。

代码:

javase/src/code02/Test08.java:

package code02;

public class Test08 {
    public static void main(String[] args) {
        
        System.out.println(0b00000000000000000000000000000101);
        System.out.println(0b11111111111111111111111111111011);
    }
}

java执行结果:

5. 位运算符

主要针对二进制的位的运算,需要将值转换为二进制后进行按位运算。

运算符含义
&按位与
|按位或
~按位非
^异或
>>右移
<<左移
>>>无符号右移(了解)

代码:

javase/src/code02/Test09.java:

package code02;

public class Test09 {
    public static void main(String[] args) {

        int a = 5; // 二进制为00000000 00000000 00000000 00000101
        int b = 8; // 二进制为00000000 00000000 00000000 00001000

        // 与:两位都为1,则为1,否则为0
        System.out.println(a & b); // 00000000 00000000 00000000 00000000

        // 或:只要有一个1,则为1,否则为0
        System.out.println(a | b); // 00000000 00000000 00000000 00001101

        // 非:如果为1,则为0;如果为0,则为1
        System.out.println(~a); // 11111111 11111111 11111111 11111010
        System.out.println(~a + 1); // -5的补码

        // 异或:如果两位相同,则为0,不同则为1
        System.out.println(a ^ b); // 00000000 00000000 00000000 00001101

        // 左移:将二进制的所有位都向左移动指定的位数,末尾补0
        System.out.println(a << 2); // 00000000 00000000 00000000 00010100

        // 右移:将二进制的所有位都向右移动指定的位数,高位补符号位
        System.out.println(a >> 2); // 00000000 00000000 00000000 00000001
        System.out.println(-a >> 2); // 11000000 00000000 00000000 00000001

        // 无符号右移:将二进制的所有位都向右移指定的位数,高位补0
        System.out.println(-a >>> 2); // 00000000 00000000 00000000 00000001

        System.out.println("-------------------------------------");

        // 位运算是非短路运算
        int i = 1;
        boolean bool = false & (i = 2) == 5 & true; // 左边虽然为false,但还是会继续执行右边的代码
        System.out.println(i);
        System.out.println(bool);
    }
}

java执行结果:

6. 位运算符和逻辑运算符的区别

逻辑运算符:

  • 逻辑运算符针对布尔值进行运算。

  • 短路运算。

位运算符:

  • 位运算符是针对二进制的位进行运算。
  • 非短路运算。
7. 练习

代码:

javase/src/code02/Test10.java:

package code02;


public class Test10 {
    public static void main(String[] args) {
        int a = 4; // 00000000 00000000 00000000 00000100
        int b = 6; // 00000000 00000000 00000000 00000110

        // x ^ y = z => x = z ^ y, y = z ^ x (=>表示可以得到)
        a = a ^ b; // 00000000 00000000 00000000 00000010
        b = a ^ b; // 00000000 00000000 00000000 00000100
        a = a ^ b; // 00000000 00000000 00000000 00000110
        // 位运算符的执行效率在所有运算符中最高(原因:数据在计算机底层以二进制形式保存,位运算符直接针对二进制的位进行运算)

        System.out.println(a);
        System.out.println(b);
    }
}

java执行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035104.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号