一、十进制整数->二进制补码
1. 用2整除的方式(正数)
- 用2整除十进制整数,得到一个商和余数;
- 再用2去除商,又会得到一个商和余
- 如此重复,直到商为小于1时为止,
- 然后把先得到余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,以此排列起来。
2. 负数转化为其补码——(其绝对值转化成二进制后)逐位取反+加一
- 将负数的绝对值转换为二进制。
- 对二进制数进行逐位取反(0变1,1变0)。
- 对取反后的二进制数加1。
3. 将字符数组转换为字符串
1 | String binary = new String(binaryStr); |
步骤
- 将字符串转换为整数:
1 | int numInt = Integer.parseInt(numStr); |
- 初始化一个长度为32的字符数组,用于存储二进制表示:
1 | char[] binaryStr = new char[32]; |
- 设置符号位
- 处理正数:使用除2取余法。从数组的末尾开始填充二进制位。
- 处理负数:
- 先将负数转换为其绝对值。
- 使用除2取余法,将绝对值转换为二进制表示。
- 对二进制表示逐位取反。
- 对取反后的二进制数加一。注意
ifplus
- 将字符数组转换为字符串并返回
1 | String binary = new String(binaryStr); |
完整代码:
1 | public static String intToBinary(String numStr) { |
二、二进制补码->十进制整数
错误方法-无法通过最大/最小值测试
1 | public static String binaryToInt(String binStr) { |
1.逐位累加(!!从左边开始!!)
- 逐位累加实现二进制转十进制的过程就是将二进制字符串中的每一位数字(从左到右)根据其所在的位置转换为相应的十进制值,并累加到最终结果中。
- 从二进制字符串的左边开始,对每个字符进行处理。
- 对每个字符,计算其对应的二进制值(1/0),然后将其加到累积结果中。
- 在处理每个字符时,将当前的累积值乘以 2,并加上当前字符所表示的数字(0 或 1)。
1 | num = num * 2 + (binStr.charAt(i) - '0'); |
- 这样,最终的结果就是二进制转换成的十进制数。
1 | int num = 0; |
2. char转int
1 | num = num * 2 + (binStr.charAt(i) - '0'); |
3. 处理负数
- 逐位取反:将二进制字符串逐位取反。
- 加一:对取反后的二进制数加一。
- 累加计算:从第0位到第31位,逐位计算二进制数对应的十进制值。
- 取反:将结果取负。
- 注意:二进制负数取反后加一等价于相当于二进制负数先减一,再取反
步骤:
- 正数处理:
- 从第0位到第31位,逐位计算二进制数对应的十进制值。
- num*2+(dinStr.charAt(i)-‘0’);
- 负数处理:
- 取反:将二进制字符串逐位取反。
- 加一:对取反后的二进制数加一。
- 累加计算:从第0位到第31位,逐位计算二进制数对应的十进制值。
- 取反:将结果取负。
- 返回结果:
- 将计算得到的十进制整数转换为字符串并返回。
完整代码
1 | public static String binaryToInt(String binStr) { |
总结:二进制补码和十进制整数相互转换:
- 负数补码和对应正数补码转换
- 负数转补码:
- 将负数的绝对值转换为二进制。
- 对二进制数逐位取反(0变1,1变0)。
- 对取反后的二进制数加1。
- 补码转负数:
- 对补码逐位取反(0变1,1变0)。
- 对取反后的二进制数加1。
- 将结果int取负。
- 负数转补码:
- 十进制整数转二进制补码:
- 正数:
- 使用除2取余法,从低位到高位依次填充二进制位。
- 符号位为0。
- 负数:
- 将负数的绝对值转换为二进制。
- 对二进制数逐位取反(0变1,1变0)。
- 对取反后的二进制数加1。
- 符号位为1。
- 正数:
- 二进制补码转十进制整数:
- 正数:
- 从第0位到第31位(从左开始!!),逐位计算二进制数对应的十进制值。
- 负数:
- 对二进制数逐位取反(0变1,1变0)。
- 对取反后的二进制数加1。
- 从第0位到第31位,逐位计算二进制数对应的十进制值。
- 将结果取负。
- 正数:
三、十进制整数的真值转化成NBCD
1. NBCD
- NBCD格式:
- 符号位
- 正数:1100
- 负数:1101
- 每个十进制数字用4位二进制数表示。
- 确保NBCD表示一定是32位。
- 在符号位和有效位之间填充0!
- 符号位
2.将单位十进制数字转化为4位二进制形式
- 除2取余法
- 先得到的余数作为低位有效位
1 | public static String CharTo4bit(Character character){ |
3. 步骤
- 将字符串转换为整数。
- 初始化一个 StringBuilder 用于构建NBCD字符串。
- 根据整数的符号设置符号位:
- 正数:1100
- 负数:1101
- 计算需要填充的零的数量,以确保NBCD表示是32位。
- 将每个十进制数字转换为4位二进制形式,并添加到 StringBuilder 中。
- 返回NBCD字符串。
4. 【注意】语法
- return new String(stringOf4);
- 适用于将字符数组char[]转换为字符串的场景
- return nbcdStr.toString();
- 适用于将StringBuilder对象转换为字符串的场景
完整代码
1 | public static String decimalToNBCD(String decimalStr) { |
四、 NBCD(符号位用4位表示)转化成十进制整数的真值
1. 4位二进制 转 1位十进制:bit4ToChar
- 从左到右,累加
- num=num*2+(bit4.charAt(i)-‘0’);
1 | public static String bit4ToChar(String bit4){ |
步骤
- 初始化一个 StringBuilder 用于构建十进制字符串。
- 从第4位开始,每4位表示一个十进制数字,使用 bit4ToChar 方法将其转换为对应的十进制字符,并添加到 StringBuilder 中。
- 去除前面多余的0(保留至少一位,以满足数为0)。
- 将 StringBuilder 转换为字符串,并解析为整数。
- 根据符号位确定结果是否为负数。
- 返回十进制字符串。
完整代码
1 | public static String NBCDToDecimal(String NBCDStr) { |
五、将浮点数真值转化成32位单精度浮点数表示
特殊
- 如果8位指数位全为0, 就代表当前数是个非规格数. 或者说, 形如 * 00000000 *********************** 格式的数就是非规格数.
- 用于表示0, 以及非常靠近0的数, 比如1E-38.
- 非规格数的实际指数固定为-126
- 如果8位指数位全为1, 就代表当前数是个特殊数. 或者说, 形如 * 11111111 *********************** 格式的数就是特殊数.
- 无穷大和NaN
1. 0
1 | if (num == 0.0f) { |
2.NaN
- 符号位:0或1
- 指数位:11111111
- 尾数位:任意非零值(通常为10000000000000000000000)
- 一般表示用:0 11111111 10000000000000000000000
1 | if (Float.isNaN(num)) { |
3. 无穷大
- 8位指数位全为1:11111111
- 23位尾数位全为0:00000000000000000000000
- 正无穷:01111111100000000000000000000000
- 负无穷:11111111100000000000000000000000
1 | if (num == Float.POSITIVE_INFINITY){ |
4. 非规格数
步骤:
- 特殊情况处理
- 零
- 正负无穷:num == Float.POSITIVE_INFINITY
- NaN: if (Float.isNaN(num))
- 正常情况处理
- 正负
- 调整尾数到1.f~2.f范围:(指数初始为0)
- 尾数偏大时,除以2,指数加1。
while (num >= 2.0f)
- 尾数偏小时,乘以2,指数减1。
while (num < 1.0f && exponent > -126)
- 如果指数减小到了
-126
,则非规格化数!
- 如果指数减小到了
- 尾数偏大时,除以2,指数加1。
- 规格化判断
- 非规格化数:如果实际指数为-126,则指数部分全为0,尾数不变(已经小于1.0f了)。
- 规格化数:尾数减去1.0f,指数加偏移量127。
- 构建IEEE 754二进制字符串:
- 符号位:1位
- 指数位:8位——除二取余法
- 尾数位:23位——乘二减一法:
- 如果乘二之后大于1.0f,则1;否则0。
- 先出现的在左!
完整代码
1 | public static String floatToBinary(String floatStr) { |
六、32位单精度浮点数表示转化成浮点数真值
1. 特殊情况
1 | //1. 0 |
2. 正常情况(规格化数+非规格化数)
- 符号位
- 指数位
- 提取指数位的8位二进制数,并转换为整数。
- 对于规格化数,减去偏移量127。
- 对于非规格化数(指数位等于0),实际指数为-126。
- 尾数位:
- 提取尾数位的23位二进制数,并转换为浮点数。
- 对于规格化数,尾数部分隐含一个1。规格化数,加1.0f
- 计算浮点数值:
- 根据指数调整尾数的值/直接算(注意double和float的转换)
- float num=weishu(float)Math.pow(2,exponent);*
- 如果符号位为1,则结果为负数。
- 根据指数调整尾数的值/直接算(注意double和float的转换)
完整代码
1 | public static String binaryToFloat(String binStr) { |
If you like my blog, you can approve me by scanning the QR code below.