CAPL:int 到字节和二进制数组
CAPL: int to byte and binary arrays
我正在尝试了解二进制数组的工作原理。下面是一个将十进制数转换为二进制数组的 CAPL 示例:
byte binaryArray[16];
binary ( int number )
{
int index;
index = 0;
for ( ; number != 0; )
{
binaryArray[index++] = number % 10;
number = number / 10;
}
}
如果输入是1234,输出显然是11010010
如果我没记错的话,for循环运行了4次:
1234 mod 10 -> 4
123 mod 10 -> 3
12 mod 10 -> 2
1 mod 10 -> 1
如果我们不处理二进制数组,它看起来像这样:{ 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0}。但它是一个二进制数组,“转换”应该发生在这里:binaryArray[index++] = number % 10;
(number 是一个 16 位有符号整数,binaryArray 是一个 8 位无符号字节)。
那么如何(手动)将 int 转换为 byte?
我发现很难“猜出”您的实际意图是什么,并且给出的示例并不真正适合我认为您想做的事情。但我会试一试。
正如您自己已经解释过的,您的示例代码总是在给定整数“number”的 base-10 系统(即个位)中删除最低有效位,然后将其按顺序存储到字节数组中.
If the input is 1234, the output is apparently 11010010
这个说法是错误的。目前,如果给定函数的输入是 1234,则“输出”(即 binaryArray 内容)是
binaryArray = { 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
此外,作为字节数组的输入数字的实际二进制表示(假设为“MSB0 first/left”和大端)是
{ 0b00000100, 0b11010010 }
由于你的“显然”(错误)陈述和你的最后一个问题,我猜你真正想要实现的和你实际要求的是:将整数序列化为字节array - 这乍一看似乎很简单,但实际上对于多字节值,你可以 运行 进入一些陷阱 - 特别是当你与其他人一起工作时(例如字节顺序和位顺序)。
假设您有一个 16 位整数,您可以将前 8 位(字节)存储在 binaryArray[0] 中,然后将您的输入整数向右移动 8 位(因为您已经存储了那些)。现在您终于可以将剩余的 8 位存储到 binaryArray[1].
鉴于您的示例输入 1234,您最终将得到数组
binaryArray = { 210, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
相当于它的“二进制”表示:
binaryArray = { 0b11010010, 0b00000100, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 }
请注意,这次字节顺序(即字节顺序)是颠倒的(小字节序),因为我们“自下而上”填充数组并且输入“二进制值”是“从右到左”读取的。
但是由于您有这个 16 单元字节数组,您可能希望将整数“number”转换为数组,表示它的二进制格式,例如binaryArray = { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0 }.
您可以通过在代码中将“模 10”/“除以 10”替换为“模 2”/“除以 2”来轻松实现此目的 - 至少对于无符号整数。对于有符号整数,它 也应该那样工作™ 但是您可能会得到模数的负值(当然还有除以 2,因为被除数是非正数并且除数是积极的)。
因此,为了在不考虑数字是否有符号的情况下完成这项工作,只需一个接一个地抓取一个位并右筛选输入直到它为 0,同时递减数组索引,即填充它“自上而下”(从 MSB0 开始/左边)。
byte binaryArray[16];
binary ( int number )
{
int index;
index = 15;
for ( ; number != 0; )
{
binaryArray[index--] = number & 0x01;
number = number >> 1;
}
}
旁注:运行时间(假设一条指令是一次努力)与“modulo/divide乘以 2”相同,因为右移 1 等于除以 2。实际上,它甚至更好一点,因为二进制与 (&) 比模 (%) 更“便宜”。
但要跟踪此类转换的位顺序和字节顺序。
我正在尝试了解二进制数组的工作原理。下面是一个将十进制数转换为二进制数组的 CAPL 示例:
byte binaryArray[16];
binary ( int number )
{
int index;
index = 0;
for ( ; number != 0; )
{
binaryArray[index++] = number % 10;
number = number / 10;
}
}
如果输入是1234,输出显然是11010010
如果我没记错的话,for循环运行了4次:
1234 mod 10 -> 4
123 mod 10 -> 3
12 mod 10 -> 2
1 mod 10 -> 1
如果我们不处理二进制数组,它看起来像这样:{ 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0}。但它是一个二进制数组,“转换”应该发生在这里:binaryArray[index++] = number % 10;
(number 是一个 16 位有符号整数,binaryArray 是一个 8 位无符号字节)。
那么如何(手动)将 int 转换为 byte?
我发现很难“猜出”您的实际意图是什么,并且给出的示例并不真正适合我认为您想做的事情。但我会试一试。
正如您自己已经解释过的,您的示例代码总是在给定整数“number”的 base-10 系统(即个位)中删除最低有效位,然后将其按顺序存储到字节数组中.
If the input is 1234, the output is apparently 11010010
这个说法是错误的。目前,如果给定函数的输入是 1234,则“输出”(即 binaryArray 内容)是
binaryArray = { 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
此外,作为字节数组的输入数字的实际二进制表示(假设为“MSB0 first/left”和大端)是
{ 0b00000100, 0b11010010 }
由于你的“显然”(错误)陈述和你的最后一个问题,我猜你真正想要实现的和你实际要求的是:将整数序列化为字节array - 这乍一看似乎很简单,但实际上对于多字节值,你可以 运行 进入一些陷阱 - 特别是当你与其他人一起工作时(例如字节顺序和位顺序)。
假设您有一个 16 位整数,您可以将前 8 位(字节)存储在 binaryArray[0] 中,然后将您的输入整数向右移动 8 位(因为您已经存储了那些)。现在您终于可以将剩余的 8 位存储到 binaryArray[1].
鉴于您的示例输入 1234,您最终将得到数组
binaryArray = { 210, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
相当于它的“二进制”表示:
binaryArray = { 0b11010010, 0b00000100, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 }
请注意,这次字节顺序(即字节顺序)是颠倒的(小字节序),因为我们“自下而上”填充数组并且输入“二进制值”是“从右到左”读取的。
但是由于您有这个 16 单元字节数组,您可能希望将整数“number”转换为数组,表示它的二进制格式,例如binaryArray = { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0 }.
您可以通过在代码中将“模 10”/“除以 10”替换为“模 2”/“除以 2”来轻松实现此目的 - 至少对于无符号整数。对于有符号整数,它 也应该那样工作™ 但是您可能会得到模数的负值(当然还有除以 2,因为被除数是非正数并且除数是积极的)。
因此,为了在不考虑数字是否有符号的情况下完成这项工作,只需一个接一个地抓取一个位并右筛选输入直到它为 0,同时递减数组索引,即填充它“自上而下”(从 MSB0 开始/左边)。
byte binaryArray[16];
binary ( int number )
{
int index;
index = 15;
for ( ; number != 0; )
{
binaryArray[index--] = number & 0x01;
number = number >> 1;
}
}
旁注:运行时间(假设一条指令是一次努力)与“modulo/divide乘以 2”相同,因为右移 1 等于除以 2。实际上,它甚至更好一点,因为二进制与 (&) 比模 (%) 更“便宜”。
但要跟踪此类转换的位顺序和字节顺序。