手动

手动

我有一个通过滚动物理六面骰子生成的 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 66 进制整数应仅使用符号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

相关内容