저는 꽤 많은 비트 시프트 연산이 포함된 코드를 디버깅하고 있으며 비트 수준에서 무슨 일이 일어나고 있는지 확인하기 위해 종종 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 대화형 셸을 사용할 수 있습니다. 예를 들어:
$ 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
내가 선호하는 방법은 4의 배수로 채우는 것입니다.
echo 'obase=2;262148'| bc | perl -pe 'chomp; $_ = 0 x ((-length) % 4) . $_;s/([01]{4})/ $1/g;s/$/\n/'