我正在调试包含相当多位移操作的代码,并且我经常使用 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/'