我有一个通过滚动物理六面骰子生成的 6 进制数字,并希望将其转换为 2 进制/二进制。
是否有内置命令或程序可以为我执行此操作?
如果不是,手动转换数字的方法是什么?
答案1
就像杰夫在评论中提示的那样,您可以用于bc
基本转换。对于物理骰子,数字通常是 1 到 6,而bc
(和数学)需要数字 0 到 5,因此您需要手动或使用类似的方法对此进行处理tr
。
例如,此函数将映射111
-> 0、112
-> 1、121
-> 6 等:
f() {
echo "obase=10; ibase=6; $(echo $1 | tr 1-6 0-5)" | bc;
}
输出为十进制,您可以通过更改obase
上面的值来更改它。或者您可以使用十进制数进行其他算术。
答案2
手动
Set total to 0
Repeat until no more roles:
multiply total by 6 #this has no effect the first time around the loop
role dice
add (number on dice -1) to total
软件
查看其他答案和评论
答案3
有几个 POSIX 工具可以将 6 进制转换为 2 进制。
然而,骰子中的符号与1 2 3 4 5 6
6 进制整数应仅使用符号0 1 2 3 4 5
不同,两者之间存在 1 的差异。使用的任何工具都必须考虑到这一点。对于个位数来说,这不是一个大问题:
最简单的是 bc(或 dc)。单个数字的转换可以如下完成:
digit=5; echo "n=$digit - 1; obase=2; n" | bc
但对于一个字符串中的多个卷,31256
需要将其输入为十进制数字,并从每个数字中减去 1(11111
在本例中),然后重新输入为 6 进制数字。
$ echo "ibase=6; obase=2; $(echo "31256-11111" | bc)" | bc
101001100001
或者,作为文本,您可以将 every 6 转换为 5、every 5 转换为 4 等:
$ echo "ibase=6; obase=2; $(echo "31256" | tr 123456 012345)" | bc
101001100001
另一种选择是 awk:
awk -v n=31256 '
function roll2dec(str, ret, i, c){
for (i = 1; i <= length(str); i++) {
c = substr(str, i, 1)
ret = ret * 6 + index("23456", c)
}
return ret
}
function dec2bin(dec, bin){
while (dec>0){
bin = dec%2 bin;
dec=int(dec/2)
};
return bin
}
BEGIN{
print dec2bin(roll2dec(n))
}'
101001100001