bc スペースで区切られたニブロバイナリ出力

bc スペースで区切られたニブロバイナリ出力

私はかなり多くのビットシフト操作を含むコードをデバッグしています。

これが私が使用するものです:

$ 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=0bc70列に数字の改行を停止することです。しかし、これは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/'

関連情報