• 进制转换_负数的补码


    补码:

    • 假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,
      即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,
      加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。

    • 计算机系统中减法问题也可以化成加法问题,
      只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码

    • 例:求-5的补码。
      -5对应负数5(00000101)→所有位取反(11111010)→加00000001(11111011)
      所以-5的补码是11111011。

    • 0的补码
      数0的补码表示是唯一的
      [+0]补=[+0]反=[+0]原=00000000
      [-0]补=11111111+1=00000000

    进制转换问题

    
    //1、把⼀个⼗进制数转为八进制
    //思路:用do{}while();循环,保证str里有数字
    //每次循环num先取余8拼到str里,之后num整除8赋值给自己,直到num到0为⽌。
    public static String decToOct(int num) {
        if (num < 0) {
            //          -10的二进制是:   ‭1_777_777_777_777_777_777_766‬
            //            10的八进制是   0_000_000_000_000_000_000_012
            //            所以,八进制正数是最高位是0
            //            八进制负数是最高位是1
            return"num<0";
        }
        String str = "";
        do {
            int mod = num % 8;
            str = mod + str;
            num /= 8;
        } while (num != 0);
        return str;
    }
    
    //2、把⼀个⼗进制数转为二进制
    //思路:同理
    public static String decToBin(int num) {
        if (num < 0) {
            //          -10的二进制是:   ‭(57个1)_1111_0110‬
            //            10的二进制是   ‭(57个1)_0000_1010
            //            所以,二进制正数是最高位是0
            //            二进制负数是最高位是1
            return"num<0";
        }
        String str = "";
        do {
            int mod = num % 2;
            str = mod + str;
            num /= 2;
        } while (num != 0);
        return str;
    }
    
    //3、把⼀个⼗进制数转为⼗六进制
    //思路:多了ABCDEF分别对应10进制的10,11,12,13,14,15
    //创建一个数组,进行数组下标对应,不用if判断了
    public static String decToHex(int num) {
        if (num < 0) {
            //          -10的⼗六进制是:   ‭FFFF_FFFF_FFFF_FFF6‬
            //            10的⼗六进制是   0000_0000_0000_000A
            //            所以,⼗六进制正数是最高位是0
            //            ⼗六进制负数是最高位是F
            return"num<0";
        }
        char[] chars = "0123456789ABCDEFG".toCharArray();
        String str = "";
        do {
            int mod = num % 16;
            str = chars[mod] + str; //取出余数,拼接
            num /= 16;
        } while (num != 0);
        return "ox"+str;
    }
    
    
    
    
    

    原码

    原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值,

    • 符号位位“0”时表示正数,

    • 符号位为“1”时表示负数,

    • 原码又称带符号的绝对值。

    • 为了方便整数和小数区别,整数的符号位与数值位之间用“,”隔开,小数的符号位与数值位之间用“.”隔开。

    反码

    反码通常是用来由原码求补码或者由补码求原码的过渡码。

    • “+0”和“-0”不一样,以8位机器数为例,整数的“+0”原码为0,0000000

    • 反码为0,0000000;整数的“-0”原码为1,0000000,反码为1,1111111;小数的“+0”原码为0.0000000,反码为0.0000000;小数的“-0”原码为1.0000000

    • 小数的“-0”反码为1.1111111。

    • 反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。

  • 相关阅读:
    爬虫笔记:使用python生成词云(八)
    31丨2内核剖析
    六飞翔篇(4讲)30 丨 2特性概览
    29 丨 我应该迁移到HTTPS吗?
    28 丨 连接太慢该怎么办:HTTPS的优化
    27丨更好更快的握手:TLS1.3特性解析
    26丨信任始于握手:TLS1.2连接过程解析
    Python全栈工程师 (exercises)
    Python全栈工程师(每周总结:2)
    Python全栈工程师(函数嵌套、变量作用域)
  • 原文地址:https://www.cnblogs.com/k-class/p/14193257.html
Copyright © 2020-2023  润新知