Java 将两条短裤组合成一个整数,处理负数和正数

Java 将两条短裤组合成一个整数,处理负数和正数,java,bit-manipulation,signed,bit-packing,Java,Bit Manipulation,Signed,Bit Packing,我正在制作一个PackedUnsigned1616类,它在一个int中存储两个无符号的short,还有一个PackedSigned1616类,它在一个int中存储两个有符号的short。我已经阅读了按位运算的相关知识,但我仍然不清楚如何处理有符号和无符号以及比短范围大或小的值(它们作为两个int传入). 以下是到目前为止我得到的信息: public final class PackedUnsigned1616 { public final int field; private static f

我正在制作一个PackedUnsigned1616类,它在一个int中存储两个无符号的short,还有一个PackedSigned1616类,它在一个int中存储两个有符号的short。我已经阅读了按位运算的相关知识,但我仍然不清楚如何处理有符号和无符号以及比短范围大或小的值(它们作为两个int传入). 以下是到目前为止我得到的信息:

public final class PackedUnsigned1616 {
public final int field;

private static final int RIGHT = (2 << 15) - 1;
private static final int LEFT = ((2 << 31) - 1) ^ RIGHT;

public PackedUnsigned1616(int left, int right) {
    field = (left << 15) | (right & RIGHT);
}

public int getLeft() {
    return field >> 15;
}
public int getRight() {
    return field & RIGHT;
}
public final class PackedUnsigned1616{
公共最终整型字段;

私有静态final int RIGHT=(2初始化左侧和右侧的有趣方法。请尝试以下方法:

public final class PackedUnsigned1616 {
    public final int field;

    private static final int RIGHT = 0xFFFF;

    public PackedUnsigned1616(int left, int right) {
        field = (left << 16) | (right & RIGHT);
    }

    public int getLeft() {
        return field >>> 16; // >>> operator 0-fills from left
    }

    public int getRight() {
        return field & RIGHT;
    }
}

那么,您想要的行为是什么呢?您可以表示的最大短路是
(2Oh,对不起,我希望它是为了好玩还是为了解决实际问题?这是用于粒子模拟器的。谢谢!但我该如何制作PackedSigned1616?@Ted-我在互联网上搜索了0xFFFF符号。这是十六进制吗?0x代表什么?此外,未签名版本的getLeft函数不起作用。我们e值(532767),它返回10和32727。对于(532766)和(527766)@cable729,同样的,
0xFFFF
表示法是十六进制文字。它在中定义。至于代码不工作,我修复了代码中的一个错误(我通过复制您的代码继承了这个错误:-0)它由16变为15。确保您使用的是修订版。是的,我也发现了:)谢谢您的帮助!对于签名值,您可以返回一个
short
    public int getLeft() {
        return field >> 16; // sign bit is significant
    }

    public int getRight() {
        return (short) (field & RIGHT); gets cast back to signed int
    }