2

如何将一个数字指定为二进制gawk

根据手册gawk将所有数字解释为十进制,除非它们前面有0(八进制)或0x(十六进制)。与某些其他语言不同,0b它不会起作用。

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

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

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

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

4

1 回答 1

2

你是对的,gawk 中没有对二进制转换的内部支持。令人难以置信的是,在printf(). 所以你被功能困住了。

请记住,awk 是弱类型的。这就是为什么函数有一些疯狂的行为,比如识别字符串开头的“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
$ 
于 2012-12-04T04:27:47.310 回答