2010年9月15日水曜日

AWKプログラムの中で、8進数や16進数を使う方法 - AWK

AWKの数値計算関数と関連機能
8進数や 16進数が大好きな方向けの情報です。

o 最低限の機能しかありませんので、不足している機能は自作します。
  + 実数を16進数表現する機能はありません。
  + 文字から文字コード(= 数値)に変換する機能もありません。


**** 手順
o 整数の値を16進数や8進数で書く方法(Gawk専用)
o 整数を16進数や8進数で表示する方法
o 16進数文字列を数値に変換する方法(Gawk専用)
o 文字列を文字コードで書く方法(= 注意事項あり)
o 文字1つを文字コードで書く方法(= 注意事項あり)


** 整数の値を16進数や8進数で書く方法(Gawk専用)
--------
v = 393; # 10進数表現

# Gawkの拡張機能
v = 0x189; # 393の 16進数表記
v = 0611; # 393の 8進数表記
--------



** 整数を16進数や8進数で表示する方法
--------
printf("%x\n", 393); # 16進数で表示
printf("%o\n", 393); # 8進数で表示
--------

o AからFを大文字にしたい時は、"%X"
o 16進数の場合、0x や 0Xを付けたい時は、"%#x" や "%#X"
o 8進数の場合、0 を付けたい時は "%#o"
o 文字にしたいだけの時は、printfの代わりに sprintfを使います。


** 16進数文字列を数値に変換する方法(Gawk専用)
o strtonum 関数を使います。
--------
v = "393" + 0; # 強制的に数値にしたい時、0と足し算します。

# Gawkの拡張機能
v = strtonum("0x189"); # 16進数表記を数値に変換
v = strtonum("0661"); # 8進数表記を数値に変換
--------

o 16進数表記の「0x」は、「0X」と書く事も出来ます。


** 文字列を文字コードで書く方法(= 注意事項あり)
o 16進数の場合「\x12」、8進数の場合「\123」の形で書きます。
o 2文字や3文字に満たない時は、数字の左を0で埋めます。
--------
v = "MikuSan";
v = "\x4d\x69\x6b\x75\x53\x61\x6e"; # 16進数表記
v = "\115\151\153\165\123\141\156"; # 8進数表記

v = "\t"; # タブ文字の場合
v = "\x09" # 16進数表記では、前ゼロを付けます。
v = "\011"; # 8進数表記でも、前ゼロを付けます。
--------

o この方法については、処理系によって制約がありますので、個別対応します。
o Gawkの場合(Gawk on Windows 3.1.7 / Gawk for Windows 3.1.6)
   + これらの処理系では、16進表記させた後に16進数となる文字が続くと、予想と異なる結果になります。
   + (例。"\x23a" は「#a」を期待して書くのですが、mawk以外では「:」コロン = 0x3a になりました。)
   + ですので、問題が起こる時は、16進数表記だけを変換して、変換結果を文字列として並べます。
o mawkの場合(mawk MBCS (32bit版) 1.3.3 / Mawk for Windows 1.3.3)
   + これらの処理系では、文字コードの 0 (= \x00)を入れると、強制終了もしくは異常終了します。
   + \x00 は、通常、目に見える文字ではありませんが、一部の文字コード(UTF-16)では、目に見える文字(= 2バイト以上あります)の一部として使用されています。
o original = the one true awk(updated May 1, 2007)の場合
   + Gawk と mawk の両方の問題を抱えています。


** 文字1つを文字コードで書く方法(= 注意事項あり)
--------
# 変数に入れる方法
v = sprintf("%c%c%c%c%c%c%c", 77,105,107,117, 83, 97,110); # 結果は MikuSan
v = sprintf("%c%c%c%c%c%c%c", 0x4d, 0x69, 0x6b, 0x75, 0x53, 0x61, 0x6e); # Gawk限定。結果は MikuSan

# 直接書き出す方法
printf("%c%c%c%c%c%c%c", 77,105,107,117, 83, 97,110); # 結果は MikuSan
--------

o 画面やファイルに書き出す時、改行コード 0x0aは、0x0d0a に自動変換されます。
   + mawkやGawkでは、変数 BINMODEを使って、この自動変換を無くす事が出来ます。
o 文字コード の 0(0x00)を文字列中に含める事が出来るのは、Gawkのみです。
   + mawkとオリジナルは、このコードを文字列変数の中に入れる事は出来ません。


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > int = 実数や文字列を整数化する
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)
    sqrt = 平方根を求める
    +
    AWKでバイナリ出力する方法(mawk, Gawk専用)
(2010年9月23日追加。文字1つを文字コードで書く方法)
(2010年9月16日追加。文字列を文字コードで書く時の、mawkの制限)

rshift = 整数を右にビットシフトする(Gawk専用) - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
符号なし整数値であると解釈して、右にビットシフトします。(論理シフトに相当します。)
o 対応しているのは整数のみです。実数や文字列を直接演算する機能はありません。

**** 書式
--------
rshift( シフトしたい値, シフトするビット数 )
--------

o シフトしたい値 -- 整数を指定します。
   + 負の値を指定した場合、符号なし整数値であると解釈します。値は0よりも大きくなります。
o シフトするビット数 -- 正の整数を指定します。
   + 負の値を指定した場合、左シフトではなく、右に最後までシフトした所から逆算します。
o 戻り値 -- 演算結果です。符号なし整数の形になります。


**** 使用例
--------
BEGIN {
  print rshift(393, 1); # 結果は 196
  print rshift(3, 1); # 結果は 1
  print rshift(3, 2); # 結果は 0
  print rshift(0, 1); # 結果は 0
  print rshift(-1, 1); # 結果は 2147483647
  print rshift(-1, 2); # 結果は 1073741823
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 符号なし整数値であると解釈して、右にビットシフトします。(論理シフトに相当します。)
o ビットシフトして出来た左側の空きには、0が入ります。
o 負の値も指定出来ますが、結果は符号なし整数の形になります。
o 実数を指定すると、小数点以下を数学的に切り捨てます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 とみなして演算します。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o 4294967295(= 32ビット =10桁程度)まで指定出来る処理系(= 32ビット整数)
   + Gawk on Windows 3.1.7
   + この処理系の場合、正しくシフト出来るのは 31ビットまでです。

o 4503599627370496(= 53ビット =16桁程度)まで指定出来る処理系(= おそらくdouble型に依存)
   + Gawk for Windows 3.1.6
   + この処理系の場合、正しくシフト出来るのは 52ビットまでです。


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > OFMT = 数値から文字列への自動変換に使う書式その1。数値1つだけの時
    CONVFMT = 数値から文字列への自動変換に使う書式その2。数値と文字列を結合する時
    ?: = 条件演算子
    +
    and = AND演算する。整数をビット毎に論理積(Gawk専用)
    or = OR演算する。整数をビット毎に論理和(Gawk専用)
    xor = XOR演算する。整数をビット毎に排他的論理和(Gawk専用)
    compl = NOT演算する。整数の1の補数(Gawk専用)
    lshift = 整数を左にビットシフトする(Gawk専用)
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)

lshift = 整数を左にビットシフトする(Gawk専用) - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows ○(注記あり)Gawk ×mawk32 ×Mawk ×awk
符号なし整数値であると解釈して、左にビットシフトします。(論理シフトに相当します。)
o 対応しているのは整数のみです。実数や文字列を直接演算する機能はありません。

**** 書式
--------
lshift( シフトしたい値, シフトするビット数 )
--------

o シフトしたい値 -- 整数を指定します。
   + 負の値を指定した場合、符号なし整数値であると解釈します。値は0よりも大きくなります。
o シフトするビット数 -- 正の整数を指定します。
   + 負の値を指定した場合、右シフトではなく、左に最後までシフトした所から逆算します。
o 戻り値 -- 演算結果です。符号なし整数の形になります。


**** 使用例
--------
BEGIN {
  print lshift(393, 1); # 結果は 786
  print lshift(1, 1); # 結果は 2
  print lshift(1, 2); # 結果は 4
  print lshift(0, 1); # 結果は 0
  print lshift(-1, 1); # 結果は 4294967294 もしくは 8589934590
  print lshift(-1, 2); # 結果は 4294967292 もしくは 17179869180
}
--------

o 結果は左から、Gawk on Windows 3.1.7、Gawk for Windows 3.1.6
o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 符号なし整数値であると解釈して、左にビットシフトします。(論理シフトに相当します。)
o ビットシフトして出来た右側の空きには、0が入ります。
o シフト結果が 4294967295 を超える時、処理系によって返す値が異なります。
o 負の値も指定出来ますが、結果は符号なし整数の形になります。
o 実数を指定すると、小数点以下を数学的に切り捨てます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 とみなして演算します。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o 扱う事の出来る値の範囲は、処理系によって異なります。
o 4294967295(= 32ビット =10桁程度)まで計算出来る処理系(= 32ビット整数)
   + Gawk on Windows 3.1.7
   + この処理系の場合、正しくシフト出来るのは 31ビットまでです。

o 4503599627370496(= 53ビット =16桁程度)まで計算出来る処理系(= おそらくdouble型に依存)
   + Gawk for Windows 3.1.6
   + この処理系の場合、正しくシフト出来るのは 52ビットまでです。
   + 32ビット整数と同等の動きをさせたい時は、シフトした結果の上位桁を切り捨てます。
   + 例えば、and(rshift(v, n), 0xffffffff)


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6 -- 求めるのは浮動小数点形式としての左シフト
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > rshift = 整数を右にビットシフトする(Gawk専用)
    OFMT = 数値から文字列への自動変換に使う書式その1。数値1つだけの時
    CONVFMT = 数値から文字列への自動変換に使う書式その2。数値と文字列を結合する時
    +
    and = AND演算する。整数をビット毎に論理積(Gawk専用)
    or = OR演算する。整数をビット毎に論理和(Gawk専用)
    xor = XOR演算する。整数をビット毎に排他的論理和(Gawk専用)
    compl = NOT演算する。整数の1の補数(Gawk専用)
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)

compl = NOT演算する。整数の1の補数(Gawk専用) - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows △(注記あり)Gawk ×mawk32 ×Mawk ×awk
符号なし整数値であると解釈して、NOT演算します = ビット毎に否定します = 1の補数を取ります。

o NOT演算は、1の時は0、0の時は1にする演算です。ビット毎に判定します。
o 対応しているのは整数のみです。実数や文字列を直接演算する機能はありません。
o 処理系によって返す値が異なりますので、注意が必要です。

**** 書式
--------
compl( 演算したい値 )
--------

o 演算したい値 -- 整数を指定します。
o 戻り値 -- 演算結果です。符号なし整数の形になります。


**** 使用例
--------
BEGIN {
  print compl(393); # 結果は 4294966902 もしくは 9007199254740598
  print compl(0); # 結果は 4294967295 もしくは 9007199254740991
  print compl(-1); # 結果は 0 もしくは 9007194959773696
}
--------

o 結果は左から、Gawk on Windows 3.1.7、Gawk for Windows 3.1.6
o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 符号なし整数値であると解釈して、NOT演算します = ビット毎に否定します = 1の補数を求めます。
o 負の値も指定出来ますが、結果は符号なし整数の形になります。
o 実数を指定すると、小数点以下を数学的に切り捨てます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 とみなして演算します。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o 補数の取り方は、処理系によって異なります。
o 32ビット整数として補数を求める処理系
   + Gawk on Windows 3.1.7
   + 4294967295まで計算出来ます。

o おそらくdouble型の補数を求める処理系
   + Gawk for Windows 3.1.6
   + 16桁程度まで計算出来ます。でも、浮動小数点形式の補数ですので、使い所が難しそうです。


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6 -- 求めるのは浮動小数点形式の補数
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > lshift = 整数を左にビットシフトする(Gawk専用)
    rshift = 整数を右にビットシフトする(Gawk専用)
    OFMT = 数値から文字列への自動変換に使う書式その1。数値1つだけの時
    +
    and = AND演算する。整数をビット毎に論理積(Gawk専用)
    or = OR演算する。整数をビット毎に論理和(Gawk専用)
    xor = XOR演算する。整数をビット毎に排他的論理和(Gawk専用)
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)

xor = XOR演算する。整数をビット毎に排他的論理和(Gawk専用) - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
符号なし整数値であると解釈して、XOR演算します = ビット毎に排他的論理和を取ります。

o XOR演算は、片方だけ 1の時は1、その他の時は0にする演算です。ビット毎に判定します。
o 対応しているのは整数のみです。実数や文字列を直接演算する機能はありません。

**** 書式
--------
xor( 値その1, 値その2 )
--------

o 値その1 -- 整数を指定します。
o 値その2 -- 整数を指定します。この演算の場合、値を入れ替えても同じ結果になります。
o 戻り値 -- 演算結果です。符号なし整数の形になります。


**** 使用例
--------
BEGIN {
  print xor(393, 393); # 結果は 0
  print xor(393, 3); # 結果は 394
  print xor(6, 3); # 結果は 5
  print xor(16, 15); # 結果は 31
  print xor(-1, 1); # 結果は 4294967294
  print xor(-1, -1); # 結果は 0
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 符号なし整数値であると解釈して、XOR演算します = ビット毎に排他的論理和を取ります。
o 負の値も指定出来ますが、結果は符号なし整数の形になります。
o 実数を指定すると、小数点以下を数学的に切り捨てます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 とみなして演算します。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o 扱う事の出来る値の範囲は、処理系によって異なります。
o 4294967295まで計算出来る処理系(= 32ビット整数)
   + Gawk on Windows 3.1.7

o 16桁程度まで計算出来る処理系(= おそらくdouble型に依存)
   + Gawk for Windows 3.1.6


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > compl = NOT演算する。整数の1の補数(Gawk専用)
    lshift = 整数を左にビットシフトする(Gawk専用)
    rshift = 整数を右にビットシフトする(Gawk専用)
    +
    and = AND演算する。整数をビット毎に論理積(Gawk専用)
    or = OR演算する。整数をビット毎に論理和(Gawk専用)
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)

or = OR演算する。整数をビット毎に論理和(Gawk専用) - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
符号なし整数値であると解釈して、OR演算します = ビット毎に論理和を取ります。

o OR演算は、両方が 0の時は0、その他の時は1にする演算です。ビット毎に判定します。
o 対応しているのは整数のみです。実数や文字列を直接演算する機能はありません。

**** 書式
--------
or( 値その1, 値その2 )
--------

o 値その1 -- 整数を指定します。
o 値その2 -- 整数を指定します。この演算の場合、値を入れ替えても同じ結果になります。
o 戻り値 -- 演算結果です。符号なし整数の形になります。


**** 使用例
--------
BEGIN {
  print or(393, 393); # 結果は 393
  print or(393, 3); # 結果は 395
  print or(6, 3); # 結果は 7
  print or(16, 15); # 結果は 31
  print or(-1, 1); # 結果は 4294967295
  print or(-1, -1); # 結果は 4294967295
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 符号なし整数値であると解釈して、OR演算します = ビット毎に論理和を取ります。
o 負の値も指定出来ますが、結果は符号なし整数の形になります。
o 実数を指定すると、小数点以下を数学的に切り捨てます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 とみなして演算します。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o 扱う事の出来る値の範囲は、処理系によって異なります。
o 4294967295まで計算出来る処理系(= 32ビット整数)
   + Gawk on Windows 3.1.7

o 16桁程度まで計算出来る処理系(= おそらくdouble型に依存)
   + Gawk for Windows 3.1.6


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > xor = XOR演算する。整数をビット毎に排他的論理和(Gawk専用)
    compl = NOT演算する。整数の1の補数(Gawk専用)
    lshift = 整数を左にビットシフトする(Gawk専用)
    +
    rshift = 整数を右にビットシフトする(Gawk専用)
    and = AND演算する。整数をビット毎に論理積(Gawk専用)
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)

and = AND演算する。整数をビット毎に論理積(Gawk専用) - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
符号なし整数値であると解釈して、AND演算します = ビット毎に論理積を取ります。

o AND演算は、両方が 1の時は1、その他の時は0にする演算です。ビット毎に判定します。
o 対応しているのは整数のみです。実数や文字列を直接演算する機能はありません。

**** 書式
--------
and( 値その1, 値その2 )
--------

o 値その1 -- 整数を指定します。
o 値その2 -- 整数を指定します。この演算の場合、値を入れ替えても同じ結果になります。
o 戻り値 -- 演算結果です。符号なし整数の形になります。


**** 使用例
--------
BEGIN {
  print and(393, 393); # 結果は 393
  print and(393, 3); # 結果は 1
  print and(6, 3); # 結果は 2
  print and(16, 15); # 結果は 0
  print and(-1, 1); # 結果は 1
  print and(-1, -1); # 結果は 4294967295
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 符号なし整数値であると解釈して、AND演算します = ビット毎に論理積を取ります。
o 負の値も指定出来ますが、結果は符号なし整数の形になります。
o 実数を指定すると、小数点以下を数学的に切り捨てます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 とみなして演算します。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o 扱う事の出来る値の範囲は、処理系によって異なります。
o 4294967295まで計算出来る処理系(= 32ビット整数)
   + Gawk on Windows 3.1.7

o 16桁程度まで計算出来る処理系(= おそらくdouble型に依存)
   + Gawk for Windows 3.1.6


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > or = OR演算する。整数をビット毎に論理和(Gawk専用)
    xor = XOR演算する。整数をビット毎に排他的論理和(Gawk専用)
    compl = NOT演算する。整数の1の補数(Gawk専用)
    +
    lshift = 整数を左にビットシフトする(Gawk専用)
    rshift = 整数を右にビットシフトする(Gawk専用)
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)