2

で数値を2進数として指定するにはどうすればよいgawkですか?

マニュアルによると、先頭に(8進数)または(16進数)gawkが付いていない限り、すべての数値を10進数として解釈します。他の特定の言語とは異なり、トリックを行いません。00x0b

たとえば、次の行では、値がそれぞれ8進数/ 10進数または10進数/10進数として解釈されるため、目的の出力(010000または)が得られません。10000

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

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

これはgawkbase-2をサポートしていない可能性があり、バイナリ表現を生成するにはユーザー定義関数が必要になると思われます。

4

1 に答える 1

2

そうです、gawkではバイナリ変換の内部サポートはありません。そして信じられないほど、には何もありませんprintf()。だからあなたは関数で立ち往生しています。

awkは弱い型付けであることに注意してください。これが、文字列の先頭にある「0x」が16進数であることを意味することを認識するなど、関数が異常な動作をする理由です。このような言語では、自分の型を制御する方がよいでしょう。

これが私が何年も座っていたいくつかの機能です...

#!/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 に答える