십진수 값을 이진수 표현으로 변환할 때 다음 명령을 사용할 수 있습니다.
val=12
D2B=({0..1}{0..1}{0..1}{0..1}{0..1})
echo ${D2B[$val]}
이것이 작동하는 동안 왜 이런 일이 발생하는지 이해하거나 알 수 없습니다. 누군가가 이를 설명하거나 이를 수행할 수 있는 리소스를 알려줄 수 있다면 좋을 것입니다.
답변1
지원 확장in form은 {x..y}
x에서 y까지의 범위에서 가능한 모든 문자를 제공합니다. 이 경우에는 및 {0..1}
가 제공됩니다 . 두 블록을 결합하면 네 가지 가능한 값이 생성됩니다.0
1
2^2
$ printf %s\\n {0..1}{0..1}
00
01
10
11
다섯 부분을 결합하면 2^5
32개의 가능한 이진 값(0에서 32까지)이 제공됩니다.
$ printf %s\\n {0..1}{0..1}{0..1}{0..1}{0..1}
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
.....
11110
11111
모든 값을 D2B
바이너리 값에 해당하는 10진수 인덱스를 사용하여 배열에 저장합니다. 인덱스 12에 액세스하면 ${D2B[$val]}
10진수 12의 이진 값이 반환됩니다.
실제로 다음을 사용하여 단축할 수 있습니다 {x,y}
.
D2B=({0,1}{0,1}{0,1}{0,1}{0,1})
답변2
첫째, 이는 메모리를 매우 비효율적으로 사용하는 접근 방식이라는 점에 유의하세요. 대신 다음 질문에 대한 답을 고려해 볼 수 있습니다.이것질문.
귀하의 질문에 대해서는 그렇지만 ...
D2B=({0..1}{0..1}{0..1}{0..1}{0..1})
D2B
이 줄은 00000에서 11111까지 가능한 모든 이진 값을 포함하는 배열을 생성합니다 . 중괄호 확장은 다음과 같이 작동합니다.
% printf '%s %s %s\n' {0..2}{0..2}{0..2}
000 001 002
010 011 012
020 021 022
100 101 102
110 111 112
120 121 122
200 201 202
210 211 212
220 221 222
중괄호 확장은 연결 시 처음부터 마지막까지 확장되므로 배열은 다음과 같습니다.
00000 00001 00010 .... 11101 11110 11111
이 값의 인덱스는 그 안에 포함된 이진 값에 해당합니다. 여기서는 중괄호 확장 및 숫자의 수학적 표현에 동일한 규칙이 사용되기 때문입니다.
따라서 인덱스 0은 00000
, 인덱스 5는 00101
, 등등입니다. $val
사용할 인덱스로 전달하므로 해당 값에 해당하는 바이너리가 에코됩니다 .