Encoding 如何将三态位打包在一起?

Encoding 如何将三态位打包在一起?,encoding,compression,bit,bit-fields,integer-arithmetic,Encoding,Compression,Bit,Bit Fields,Integer Arithmetic,我正在寻找一个聪明的解决方案,它允许打包成一个16位整数,至少9个3态“位”。还可以轻松设置这些三态“位”的值 例如,它可以用于编码tic-tac-toe位置,树的状态为,九方板的_u(空)、X(me)、O(对手) 当然,每平方使用2位就可以了,但总体上需要18位。是否有一种编码,每平方最多只使用1.7位,并且仍然可以简单地使用它?您可以在一个16位整数中存储十个3状态值,因为310=59049

我正在寻找一个聪明的解决方案,它允许打包成一个16位整数,至少9个3态“位”。还可以轻松设置这些三态“位”的值

例如,它可以用于编码tic-tac-toe位置,树的状态为,九方板的_u(空)、X(me)、O(对手)


当然,每平方使用2位就可以了,但总体上需要18位。是否有一种编码,每平方最多只使用1.7位,并且仍然可以简单地使用它?

您可以在一个16位整数中存储十个3状态值,因为310=59049<65536。只需将一个10位的3进制数字编码成一个16位整数,然后以另一种方式将这些数字取出来


要对每个数字
d
进行编码,重复操作为
n=3*n+d
。要以相反的顺序解码数字,重复的操作是
d=n%3
n/=3

只有在删除“并且仍然保持简单的操作”要求的情况下才可以。除法和模运算并不是那么有效,但我敢肯定,如果使用某些编译器,这并不是严格需要的。@ThomasMueller现代编译器已经知道这些,所以您不必费心了。我只是尝试了一下clang并查看了汇编程序的输出,它知道如何用一个加载有效地址实现乘法,以及如何用乘法和移位实现模和除法。它甚至发现只需进行一次乘法,就可以在同一个输入上得到除法和模运算结果。