【问题标题】:How do I save multiple small integers in one integer via bitshifting?如何将一个整数中的多个小整数保存到位移位?
【发布时间】:2016-09-15 06:34:24
【问题描述】:

我在 int[][][] 数组中工作,我需要从静态函数返回该数组的一个字段的地址。 鉴于 Array 的尺寸将保持较小 (int[32][32][32]),我的想法是返回一个包含所有三个值的数字,而不是使用包含三个数字的 Array。

我已经有了一个可行的解决方案,我将我的号码打包成一个字符串,并通过Integer.parseInt(String) 在接收方法中将其解包。 不幸的是,这在运行时方面效果不佳,所以我想到了位移。

我为我糟糕的英语道歉,希望这个简单的问题值得你花时间:)

【问题讨论】:

  • 到目前为止你尝试过什么代码?
  • Bitshifting 是否可用取决于数字的大小。我的意思是,如果您需要存储 0-99 之间的值,您可以将 347203 保存在像 347203 这样的数字中。
  • 你也可以使用字符串,这样处理起来会容易很多
  • @UDKOX 是正确的 - 以 100 为基数的简单编码适合您的用例 - 在许多机器上除以小常数(100、1000)一点也不贵,而且这个解决方案具有优势如果它在基数 100 而不是基数 64 或基数 256 中,那么在调试时确定编码索引是什么肯定更容易!
  • @UDKOX 这正是我的想法!我的数字在 0 到 31 的范围内

标签: java arrays return bit-shift return-type


【解决方案1】:

如果您的数字在 0...255 范围内,此示例会将三个数字编码为一个 int,然后再次解码...

public class BitDemo {

    public static void main(String[] args) {
        int encoded = encode(20, 255, 10);
        int[] decoded = decode(encoded);

        System.out.println(Arrays.toString(decoded));
    }

    private static int[] decode(int encoded) {
        return new int[] {
                encoded & 0xFF,
                (encoded >> 8) & 0xFF,
                (encoded >> 16) & 0xFF
        };
    }

    private static int encode(int b1, int b2, int b3) {
        return (b1 & 0xFF) | ((b2 & 0xFF) << 8) | ((b3 & 0xFF) << 16);
    }
}

(b1 &amp; 0xFF) - 获取 b1 的前 8 位

((b2 &amp; 0xFF) &lt;&lt; 8) - 获取 b2 的前 8 位并将它们左移 8 位

((b3 &amp; 0xFF) &lt;&lt; 16) - 获取 b3 的前 8 位并将它们左移 16 位

这三个数字是 ORed 在一起的。

如果你有负数或大于 255 的数,你会得到不同的结果。

【讨论】:

  • 感谢这个解决方案,它就像预期的那样工作!我似乎不太明白为什么您的示例中使用了int encoded !=2025510。这将使调试变得容易得多。
  • 通俗易懂,文笔优美。 +1。几个问题,这只使用了 3 / 4 个字节的 int 对吗?
  • @UDKOX 是的,您可以添加第四个字节,即((b3 &amp; 0xFF) &lt;&lt; 24)
【解决方案2】:

鉴于NMO 并假设N * M * O 没有溢出,您可以像这样打包和解包您的索引:

int packed = o * (N * M) + m * N + n;
int o = packed / (N * M);
int m = (packed % (N * M)) / N;
int n = packed % N; // is equal to (packed % (N * M)) % N

如果您想使用位移,请确保选择 N, M, O 作为 2 的幂。假设 N = 2^NSM = 2^MSO = 2^OS 打包和解包如下所示:

int packed = (o << (NS + MS)) | (m << NS) | n;
int o = (packed >> (NS + MS)) & ((1 << OS) - 1);
int m = (packed >> NS) & ((1 << MS) - 1);
int n = packed & ((1 << NS) - 1);

以上所有假设n=0..N-1m=0..M-1o=0..O-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2020-10-03
    • 2017-12-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多