0

我有以下预定义的代码表示二进制位图中的索引:

0 = standard
1 = special
2 = regular
3 = late
4 = early
5 = on time
6 = generic 
7 = rfu

我将作为输入的示例值是 213,它在二进制中变为 11010101。索引 0、2、4、6 和 7 的位翻转表示该记录为:标准 + 常规 + 早期 + 通用 + rfu。

我试图在 perl 中弄清楚如何获取二进制数据并构建一个字符串,就像上面提到的代码 + 代码 + 代码等一样。

任何帮助将不胜感激。谢谢。

编辑:我对如何解决这个问题的想法是:

  1. 十进制转二进制
  2. 查找二进制字符串的长度
  3. 使用 substr 按索引获取值(0 或 1)
  4. 如果索引值 = 1 则将相关代码添加到字符串

有没有更好的方法来解决这个问题?

4

1 回答 1

3

您可以测试从 0 到 7 的输入位,并且只取那些已设置的位,

my $in = 213;
my @r = ("standard","special","regular","late","early","on time","generic","rfu");

print join " + ", @r[ grep { $in & (1 << $_) } 0 .. $#r ];

# or
# print join " + ", map { $in & (1<<$_) ? $r[$_] : () } 0 .. $#r;

输出

standard + regular + early + generic + rfu
于 2013-10-02T21:52:09.993 回答