【问题标题】:binary numbers in gawkgawk 中的二进制数
【发布时间】:2012-12-04 12:27:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: gawk radix


    【解决方案1】:

    你是对的,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
    $ 
    

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2010-12-04
      • 2012-10-26
      • 1970-01-01
      相关资源
      最近更新 更多