【问题标题】:Java 16 bit alignmentJava 16 位对齐
【发布时间】:2013-05-23 15:53:56
【问题描述】:

我目前正在处理一些表示文件中偏移量的整数值,我需要在 16 位边界上对齐这些数字,但是我有点不确定如何做到这一点。

例如:

First number: 89023
16-bit aligned: 89024

Second number: 180725
16-bit aligned: 180736

Third number: 263824
Already 16-bit aligned, don't need to change it.

这可能是我的数学不及格,但如果有人能就如何在 Java 中实现这一点提出建议,我将不胜感激。

谢谢!

更新

我想我刚刚解决了,只需将值修改为 16,然后计算出 16 中缺少的内容。

例如:

180725 % 16 = 5
16 - 5 = 11
180725 aligned to 16-bits is: 180736

有人可以确认我这样做是正确的吗?

【问题讨论】:

  • 是的,您正在四舍五入到下一个 16 位对齐。

标签: java binary alignment bit


【解决方案1】:

在另一个答案/评论中描述了两种可能性。以下是完整的实现:

public static int getAlignment_modulus() {
    int offset = num % 16;
    int result = offset == 0 ? num : num + 16 - offset;
    return result;
}

public static int getAlignment_bitOps() {
    return (num + 15) & ~15;
}

【讨论】:

    【解决方案2】:

    是的,这会起作用。 16 位边界对齐只是确保它将是 16 的倍数。您在此处所做的是确保该值达到下一个值 16,向上取整。

    // find how far off of alignment you are, 0-15
    offset = num % 16 
    // determine how much further you need to move the value to achieve 16 bit alignment
    // only use if offset > 0, otherwise you are already good
    val = 16 - offset
    

    【讨论】:

    • 由于 16 是 2 的幂,实现相同的更快方法是计算 (num + 15) & ~16
    • @fge 实际上检查程序集,num % 16 被转换为~ (~i & 15) + 16。所以,像往常一样,编译器足够聪明,我们不必为按位技巧而烦恼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多