私はかなり多くのビットシフト操作を含むコードをデバッグしています。
これが私が使用するものです:
$ echo 'obase=2;598980975283696640' | bc
100001010000000000100000011000000011000000000111010000000000
スペースで区切られたニブル出力を取得する簡単な方法はありますか?例えば
1000 0101 0000 0000 0010 0000 0110 0000 0011 0000 0000 0111 0100 0000 0000
ご回答ありがとうございます!
編集:返信ありがとうございます!しかし、
別の番号262148で試してみました。
しなければならない:
100 0000 0000 0000 0100
しかし、それは:
1000 0000 0000 0000 100
正しい結果を得るには、スクリプトが文字列を逆に検索する必要があると思いますか?
答え1
echo 'obase=2;598123123980975281233696640' | BC_LINE_LENGTH=0 bc |
rev | fold -w4 | paste -sd ' ' - | rev
または:
echo 'obase=2;598123123980975281233696640' | BC_LINE_LENGTH=0 bc | sed ':1
s/\(.*[01]\)\([01]\{4\}\)/\1 \2/;t1'
BC_LINE_LENGTH=0
bc
70列に数字の改行を停止することです。しかし、これはGNUに固有のものです。rev
標準コマンドではありませんが、一般的です。
答え2
私は次の簡単な機能を使用します。
nibbles () { echo "obase=2; $1" | bc | rev | while read -n4 a; do echo -n "$a ";done | rev ; echo; }
$ nibbles 598980975283696640
1000 0101 0000 0000 0010 0000 0110 0000 0011 0000 0000 0111 0100 0000 0000
答え3
代わりに、Pythonインタラクティブシェルを使用できます。たとえば、
$ python
>>> s = bin(598980975283696640)[2:]; s = '0'*(4-len(s)%4)*(len(s)%4>0)+s
>>> [s[i:i+4] for i in range(0, len(s), 4)]
['1000', '0101', '0000', '0000', '0010', '0000', '0110', '0000',
'0011', '0000', '0000', '0111', '0100', '0000', '0000']
>>> s = bin(5989809752836966)[2:]; s = '0'*(4-len(s)%4)*(len(s)%4>0)+s
>>> [s[i:i+4] for i in range(0, len(s), 4)]
['0001', '0101', '0100', '0111', '1011', '0011', '0100', '0010',
'1001', '0111', '0000', '1011', '0110', '0110']
または1回のヒット:
$ python -c 's = bin(598980975283696640)[2:]; s = '0'*(4-len(s)%4)*(len(s)%4>0)+s; print [s[i:i+4] for i in range(0, len(s), 4)]'
['1000', '0101', '0000', '0000', '0010', '0000', '0110', '0000', '0011', '0000', '0000', '0111', '0100', '0000', '0000']
答え4
私が好む方法は4の倍数で埋めることです。
echo 'obase=2;262148'| bc | perl -pe 'chomp; $_ = 0 x ((-length) % 4) . $_;s/([01]{4})/ $1/g;s/$/\n/'