解包指数因子表将打包值乘以原始值

时间:2014-03-01 19:38:50

标签: java pow exponentiation exponent

我有这个扑克牌游戏,可能的13张牌排名存储为[0到12]。 每手持有5张牌,其中有13张可能的牌位。

最终值是一个标识符,从指数13⁵(到5的幂)开始。

它存储了什么样的获胜手牌。 然后剩余的5个13的幂用于存储5张牌中的每一张。

另外更不用说并非所有5张牌都是随时存放的,这仅限于高牌赢,这需要4个踢球。

我的问题是只使用最终价值,我如何能够解开每张卡片以及获胜的手牌。

/** The ranking factors (powers of 13, the number of ranks). */
private static final int[] RANKING_FACTORS = {371293, 28561, 2197, 169, 13, 1};

rankings[0] = HIGHCARD WIN [0]
rankings[1] = 12; //Ace
rankings[2] = 6; //Eight
rankings[3] = 9; //Jack
rankings[4] = 1; //Three
rankings[5] = 3; //Five

// Calculate value.
for (int i = 0; i < NO_OF_RANKINGS; i++) {
    value += rankings[i] * RANKING_FACTORS[i];
}

(0*371293) + (12*28561) + (6*2197) + (9*169) + (1*13) + (3*1) = 357451

尝试从357451值解压缩值。 开始尝试在这里弄清楚数学。

if 357451 < 371293                        rankings[0] = 0

(357451 / 28561) = 12                     rankings[1] = 12
(357451 / 2197) / ((13*2)+1) = 6          rankings[2] = 6
(357451 / 169)  / ((13*18)+1) = 9         rankings[3] = 9
//Alright it seems that 18 is from answers (12+6) probably because I haven't subtracted them or something.
//So next one should be (12+6+9)= 27, but it's 2115
(357451 / 13)  / ((13*2115)+1) = 1        rankings[4] = 1
(357451 / 1) / ((13*9165)+1) = 3          rankings[5] = 3

我想我已经明白了,但我不明白这些价值可能只适用于这种情况会破坏任何其他情况。

不知道值2, 18, 2115, 9165在哪里产生了可能是我编造的一些废话。

我该如何正确地做到这一点?我不认为我可以使用移位,因为这不是按位。

那么这样做呢?

(357451 / 371293)          = 0
(357451 / 28561)           = 12
(357451 % 28561) / 2197    = 6
(357451 % 2197) / 169      = 9

(357451 % 169) / 13        = 1
(357451 % 13)              = 3

1 个答案:

答案 0 :(得分:1)

通过这部分你是对的。

(357451 / 28561) = 12                     rankings[1] = 12

但这不好......

(357451 / 2197) / ((13*2)+1) = 6          rankings[2] = 6

你需要取结果12并将其乘以28561然后从357451中减去它,看看剩下的是什么。在这种情况下,它是14719。

现在你可以继续使用那个数字而不是357451.所以14719/2197 = 6。

继续使用该模式(14719 - (2197 * 6)),直到获得5个数字。

如果你想这样做的话,

(357451%28561)也会给你余数。

我的“解码”代码......

private static final int[] RANKING_FACTORS = {4826809, 371293, 28561, 2197, 169, 13, 1};

@Test
public void testDecode() {
    long value = 357451;
    int[] rankings = new int[6];
    //System.out.println(Math.max(0,value-RANKING_FACTORS[0]));
    for (int i=0; i < rankings.length; i++) {
        rankings[i] = (int)(value / RANKING_FACTORS[i]);
        value %= RANKING_FACTORS[i];
        System.out.println(rankings[i]);
    }
}