gawk中的二进制数

时间:2012-10-26 23:59:47

标签: gawk radix

如何在gawk中将数字指定为二进制?

根据manualgawk将所有数字解释为十进制,除非它们前面有0(八进制)或0x(十六进制)。与某些其他语言不同,0b无法解决问题。

例如,以下行不提供所需的输出(01000010000),因为这些值分别被解释为八进制/十进制或十进制/十进制:

gawk '{print and(010000,110000)}'
0

gawk '{print and(10000,110000)}'
9488

我怀疑gawk可能不支持base-2,并且需要用户定义的函数来生成二进制表示。

1 个答案:

答案 0 :(得分:2)

你是对的,gawk中没有内部支持二进制转换。令人难以置信的是,printf()中甚至没有。所以你坚持使用功能。

请记住,awk是weakly typed。这就是为什么函数有疯狂的行为,比如识别字符串开头的“0x”意味着它是十六进制数。在这样的语言中,最好控制自己的类型。

这是我多年来一直坐着的几个功能......

#!/usr/local/bin/gawk -f

function bin2dec(n) {
  result = 0;
  if (n~/[^01]/) {
    return n;
  }
  for (i=length(n); i; i--) {
    result += 2^(length(n)-i) * substr(n,i,1);
  }
  return result;
}

function dec2bin(n) {
  result = "";
  while (n) {
    if (n%2) {
      result = "1" result;
    } else {
      result = "0" result;
    }
    n = int(n/2);
  }
  return result;
}

{
  print dec2bin( and(bin2dec($1),bin2dec($2)) );
}

结果:

$ echo "1101 1011" | ./doit.awk
1001
$ echo "11110 10011" | ./doit.awk
10010
$