簡體   English   中英

在Java中使用原始字節進行位移位

[英]Bit Shifting using primitive byte in Java

我想解碼使用可變字節編碼的文檔。 連續位為1(通常不為0)。 對於我讀取的每個字節,我檢查它是否大於128:

  • 是(> = 128)我將先前的7位值移位,然后將較低有效位的值相加。
  • 否(<128)我將先前的7位值移位,然后將較低有效位的值相加。 結束。

我試圖用Java實現。 這是結果

static int[] decodeRawDoc(byte[] rawDoc, int[] document) {
    int k = 0;
    int n = 0;
    int a = 0;
    for (byte b : rawDoc) {
        if ((b & 0xff) >= 128) {
            a = (b << 25);
            n = n * 128 + (a >>> 25);
        } else {
            int num = n * 128 + b;
            document[k] = num;
            k++;
            n = 0;
        }
    }
    return document;
}

它有效,但是我不喜歡>>> 25轉換部分。 有沒有更優雅的方式來執行相同的操作,最好使用字節?

輸入(字節rawDoc []):

129233121 130 254 18129 134 58 142 79 170 87 11 129233121 130 254 18 129 134 58 130 133 126 131 52 131 97 185 1 131 22 19 131 22 130 32 53 134 1 130 109 137 58 131 52 136 99 142 68 188 104 147 30 86 129 204 9 135 96 130 109 130 225 99 135 96 135 14 159 68 142 7 129 111 131 97 133 174 215 85 137 80 131 97 159 105 130 254 18 141 105 134 229 229 75 2 6 129 21 129 33 129 159 56 132 5 130 139 44 140 137 162 51 2 140 138 128 70 2 36 129 21 129 33 140 138 232 46 2 133 132 92 2 21 129 21 129 33 56 129 21 129 33 45 129 21 129 33 133 56 129 233 121 130 254 18 129 134 58 142 79 80 142 79 57 19 132 80 19 148 126 19 134 107 19 131 32 2 19 16 130 2 134 107 133 66 133 66 2 141 100 43 129 233 121 130 254 18 12913458148204254254 2 2

預期的輸出(int []文件):

29945 48914 17210 1871 5463 11 29945 48914 17210 33534 436 481 7297 406 19 406 288 53 769 365 1210 436 1123 1860 7784 2462 86 26121 992 365 45283 992 910 4036 1799 239 481 11250645 1232 481 4073 48914 1769 111307 2 6 149 161 20408 517 34220 25317683 2 25329734 2 36 149 161 25343022 2 82524 2 21 149 161 56 149 161 45 149 161 696 29945 48914 17210 1871 80 1871 57 19 592 19 2686 19 875 19416 2 19 16 258 875 706 706 2 1764 43 29945 48914 17210 43204355 2

輸出(W / n = n * 128 + (b + 0xFF);

2126969 2145938 2114234 18127 21719 11 2126969 2145938 2114234 2130558 16692 16737 23553 16662 19 16662 16544 53 17025 16621 17466 16692 17379 18116 24040 18718 86 2123145 17248 16621 2142307 17248 17166 20166 180292 1655 16495 16737 279685973 17488 16737 20329 2145938 1625 22043417 2131244 293753011 2 293765062 2 36 16405 16417 293778350 2 2179548 2 21 16405 16417 56 16405 16417 45 16405 16417 16952 2126969 2145938 2114234 18127 80 18127 57 19 16848 19 18942 19 17131 19 16672 2 19 16 16514 17131 16962 16962 2 18020 43 2126969 2145938 2114234 311639683 2

輸出( if ((b & 0xff) >= 0x80) n = (n * 128) + (b + 0x7f)

13433 32402 698 1743 5335 11 13433 32402 698 17022 308 353 7169 278 19 278 160 53 641 237 1082 308 995 1732 7656 2334 86 9609 864 237 28771 864 782 3908 1671 111353 9136981 1104 353 3945 32402 1641 94795 2 6 21 33 3896 389 17708 23204019 2 23216070 2 36 21 33 23229358 2 66012 2 21 21 33 56 21 33 45 21 33 568 13433 32402 698 1743 80 1743 57 19 464 19 2558 19 747 19 288 2 288 16 19 130 130 747 578 578 2 1636 43 13433 32402 698 41090691 2

聽起來您真的只是想掩蓋底部的7位-最簡單的方法是使用&

if ((b & 0xff) >= 0x80) {
    n = (n << 7) + (b & 0x7f);
}

我已經更改了所有內容以使用十六進制或移位,因為我認為這更清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM