bc 输出二进制为由空格分隔的半字节

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=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 交互式 shell。例如:

$ 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']

或者只是一击:

$ 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

我首选的方法是将其填充为四的倍数:

echo 'obase=2;262148'| bc | perl -pe 'chomp; $_ = 0 x ((-length) % 4) . $_;s/([01]{4})/ $1/g;s/$/\n/'

相关内容