• 进制转换随手记


    进制和二进制位数的关系

    8进制和3个二进制位

    3个2进制位可以表示1位8进制数,因为000~111=0~7,当一个8进制数转2进制时,只需要把每一位8进制数转成三位2进制数即可,即三位2进制数为1组;
    当2进制数据转8进制时,整数部分以小数点左侧开始,每三位一组,不足时前补零,小数部分以小数点右侧开始,每三位一组,不足时后补零。
    例如:
    236.25Q=010 011 110.010 101B=10011110.010101B
    10110101.0101011B= 010 110 101.010 101 100B=265.254Q

    16进制和4个二进制位

    4个2进制位可以表示1位16进制数,因为0000~1111=0~F
    16进制是满15进1,4个bit最大值是1111=15,一个字节可以表示两个16进制数,可以把一个字节看成高四位和低四位
    一个byte=1个字节=8位=高四位|低四位
    2进制和16进制的转换同8进制转换方式

    BCD码和4个二进制位

    BCD码是2进制和10进制相互转换的编码格式,BCD码是用四位2进制表示一个10进制中的数字
    BCD码分有权码和无权码
    有权码分为:8421、2421、5421
    无权码:余3码

    8421码

    BCD码是8421码,是指用4个bit表示一个0~9的十进制数,最大值是1001=9

    8进制、10进制和16进制转换

    各进制都是满n进1,例如:
    16进制,F+1=1111+0001=10000,每4位看成1位16进制数,那么10000=0001 0000=10,10中的高位表示16的1次幂
    8进制,7+1=111+001=1000,每3位看成1位8进制数,那么1000=001 000=10,10中的高位表示8的1次幂

    8进制和16进制如何转换呢?
    可以先把8进制转成2进制,再由2进制转换16进制,也就是1:3转换再由4:1转换

    2进制和10进制在转换的过程中,会存在精度丢失的情况,所以通常用8进制或16进制来表示2进制数据。

    java的字符和ascii不同

    java的一个char是两个字节,char c = ‘7’,(byte)c = 55,而不是7,55是ascii码中的,减去48才是数字7

    public class DataUtil {
    
        /**
         * 方法:字节转BCD编码字符串
         * 

    * BCD编码: * BCD码是2进制和10进制相互转换的编码格式,BCD码是用四位2进制表示一个10进制中的数字 * BCD码分有权码和无权码 * 有权码分为:8421、2421、5421 * 无权码:余3码 *

    * 8421码: * 是指用4个bit表示一个0~9的十进制数,二进制0000~1001即8421的取值范围,1010~1111在8421码中是无意义的。 * 如果两个8421码相加的和大于1001,那么就要+6进行修正,向高位进位! * 例如:9+1=1001+0001,如果直接相加得出的结果1010,1010不在8421编码范围,因此要+6修正,即:1010+0110=0001 0000 * * @param bytes 例:[0, 0, 0, 0, 34, 0, 0, 0, 0, 2] * @return 例:00000000220000000002 */ public static String toBCD(byte[] bytes) { // 1个字节两个bcd数 StringBuffer temp = new StringBuffer(bytes.length * 2); // 每个字节分高四位和第四位存储为字符串 for (int i = 0; i < bytes.length; i++) { // 如:一个字节的34的二进制表示:10 0010,高四位10=2,第四位0010=2,最后结果为22 temp.append((byte) ((bytes[i] & 0xf0) >>> 4)); temp.append((byte) (bytes[i] & 0x0f)); } return temp.toString(); } /** * 方法:大端模式,字节转无符号数 * 注:数据的长度必须在8字节以内,long类型会出现超出范围的情况 * 实际上可以通过Netty的ByteBuffer去计算 * * @param bytes * @return */ public static long toLong(byte[] bytes) { int size = bytes.length; long t = 0; int index = 0; int limit = size; do { size--; if (size == 0) { t = t | (bytes[index] & 0xFF); } else { t = t | ((bytes[index] & 0xff) << (8 * size)); } index++; } while (size > 0 && index < limit); return t; } public static void main(String[] args) { toBCD(new byte[]{0, 0, 0, 0, 34, 0, 0, 0, 0, 2}); } }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    Semantic Kernel 学习笔记1
    设计模式-单例模式
    C#学习系列之继承
    手把手带你玩摄像头模组
    Unity调用API函数对系统桌面和窗口截图
    ajax是什么?
    B端产品设计流程--产品定位
    Python 列表切片详解
    c++代码生成标定板
    AWTK UI 自动化测试工具发布
  • 原文地址:https://blog.csdn.net/qq_30038111/article/details/126905180