WebGL Tutorial
and more

各种进制工具类

撰写时间:2025-01-30

修订时间:2025-02-06

本页为本站所编制的处理不同进制的工具类的测试。

目前实现了BinUtils.js,主要用以处理二进制及十六进制。

二进制工具

getBinStr

基本用法

getBinStr用于获取特定数值的二进制字符串。

const { getBinStr } = await import('/js/esm/BinUtils.js'); let num = 0x3D; pc.log('%d', num); pc.log('%s', getBinStr(num, 4)); pc.log('%s', getBinStr(num));

2个参数用以指定每隔多少位分开显示,默认为8位。

所显示的位数,根据数值的大小,自动按8位、16位、32位、64位、128位的顺序予以对齐。

const { getBinStr } = await import('/js/esm/BinUtils.js'); let num1 = 0x2F_3D; pc.log('%d', num1); pc.log('%s', getBinStr(num1)); let num2 = 0x3A_2F_3D; pc.log('%d', num2); pc.log('%s', getBinStr(num2, 16));

负数的二进制表示

对于一个负数的二进制表示,JavaScript是先求出该数绝对值的二进制,然后再在结果前面添加负号-

let num1 = 5; pc.log('%d, %s', num1, num1.toString(2)); let num2 = -5; pc.log('%d, %s', num2, num2.toString(2));

这是JavaScript独创的表示方法。与负数的原码sign-magnitude), 反码one's complement)及补码two's complement)二进制表示法均不相同。

下面是-5的各种规范表示方法:

0x0000_0101 // 5 的原码 0x1000_0101 // -5 的原码:最高位为符号位,0正1负,其余位表示绝对值的二进制 0x1111_1010 // -5 的反码,保留原码符号位,其余位取反 0x1111_1011 // -5 的补码,反码加1

因此,JavaScript对负数的二进制表示法,实际上是在绝对值的原码前面直接添加负号。这种方法即不规范,并且结果也不能直接表示其最高位的值为1

但实际上,现代计算机系统均使用补码来表示负数的二进制数。这种表示方法的优点是算法高效、表示唯一,且能多表示一个负数。缺点是当肉眼看到其二进制数值时,很难通过运算得到原来的十进制数值。

当我们查看一个整数的二进制时,使用原码的方式最为直观,最高位表示符号,其余位表示数值。鉴于此,getBinStr采用原码的表达方式。

const { getBinStr } = await import('/js/esm/BinUtils.js'); let num1 = 5; pc.log('%d, %s', num1, getBinStr(num1, 4)); let num2 = -5; pc.log('%d, %s', num2, getBinStr(num2, 4)); let num3 = 355; pc.log('%d, %s', num3, getBinStr(num3, 8)); let num4 = -355; pc.log('%d, %s', num4, getBinStr(num4, 8));

十六进制工具

getHexStr

显示单个十六进制:

const { getHexStr } = await import('/js/esm/BinUtils.js'); let num1 = 0xFF; pc.log('%d, %s', num1, getHexStr(num1)); let num2 = 0x5D_FF; pc.log('%d, %s', num2, getHexStr(num2));

对于十六进制的数值来讲,使用大写字母来表达较为美观。为与表示数值的字母相区分,前缀0x使用小写字母来表示。

默认情况下,显示0x前缀。可不显示该前缀,以适用于不同的场合。

const { getHexStr } = await import('/js/esm/BinUtils.js'); let num = 0xFF; pc.log('%d, %s', num, getHexStr(num, false));

指定需对齐显示的位域:

const { getHexStr } = await import('/js/esm/BinUtils.js'); let num = 0xFF; pc.log('%d, %s', num, getHexStr(num, true, 4));

负数的十六进制:

const { getHexStr } = await import('/js/esm/BinUtils.js'); let num = -35; pc.log('%d, %s', num, getHexStr(num));

getHexAddrStrFromArray

显示数值数组的内存地址及数值:

const { getHexAddrStrFromArray } = await import('/js/esm/BinUtils.js'); const { NumUtils } = await import('/js/esm/NumUtils.js'); let numArr = NumUtils.GetIntsInRange(0x00, 0xFF, 32); let colsPerRow = 8; let leftColWidth = 4; let colGap = 2; let str = getHexAddrStrFromArray(numArr, colsPerRow, leftColWidth, colGap); pc.log('%s', str);

如果字符ASCII值位于[32, 126][128, 255]的范围内,则予以打印字符;否则,为不可打印字符,以.来代替。

getHexAddrStrFromTypedArray

显示类型化数组的内存地址及数值:

const { getHexAddrStrFromTypedArray } = await import('/js/esm/BinUtils.js'); const { NumUtils } = await import('/js/esm/NumUtils.js'); let numArr = NumUtils.GetIntsInRange(0x00, 0xFF, 32); let tarr = new Uint16Array(numArr); let colsPerRow = 16; let leftColWidth = 4; let colGap = 2; let str = getHexAddrStrFromTypedArray(tarr, colsPerRow, leftColWidth, colGap); pc.log('%s', str);

自动获取是否有符号的信息,再按Uint8ArrayInt8Array的视图拆分为字节来显示。

参考资源

  1. Number.prototype.toString()