【问题标题】:CAPL: int to byte and binary arraysCAPL:int 到字节和二进制数组
【发布时间】:2021-03-30 14:05:25
【问题描述】:

我试图了解二进制数组的工作原理。这是一个将十进制数转换为二进制数组的 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 模 10 -> 2

  • 1 模 10 -> 1

如果我们不处理二进制数组,它看起来像这样:{ 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 }。但它是一个二进制数组,“转换”应该发生在这里:binaryArray[index++] = number % 10;(数字是一个 16 位有符号整数,binaryArray 是一个 8 位无符号字节)。

那么如何(手动)将 int 转换为 byte?

【问题讨论】:

    标签: arrays capl


    【解决方案1】:

    我发现很难“猜测”您的实际意图是什么,并且给定的示例并不真正适合我认为您想要做的事情。不过我会试一试的。

    正如您已经自己解释的那样,您的示例代码总是在给定整数“数字”的 base-10 系统(即个位)中删除最低有效位,然后将其按顺序存储到一个字节数组中。

    如果输入是 1234,那么输出显然是 11010010

    这个说法是错误的。目前,如果给定函数的输入为 1234,则“输出”(即 binaryArray 内容)为

    binaryArray = { 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    

    此外,您的输入数字作为字节数组的实际二进制表示(假设“MSB0 第一/左”和大端)是

    { 0b00000100, 0b11010010 }
    

    由于您的“显然”(错误)陈述和最后一个问题,我猜您真正想要实现的以及您实际要求的是:将整数序列化为字节数组 - 首先看起来很简单,但实际上对于多字节值,您可能会遇到一些陷阱 - 尤其是当您与其他人一起工作时(例如字节序和位排序)。

    假设您有一个 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 单元字节数组,您可能希望将整数“数字”转换为数组,表示它的二进制格式,例如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;
       }
    }
    

    旁注:运行时(假设一条指令作为单一工作)与“模/除以 2”相同,因为右移 1 等于除以 2。实际上,它甚至更好一点,因为二进制-和 (&) 比模 (%) 更“便宜”。

    但要跟踪此类转换的位顺序和字节序。

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 2012-05-08
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 2016-09-10
      • 2018-04-28
      相关资源
      最近更新 更多