Java 比较有符号十六进制数

Java 比较有符号十六进制数,java,signed,hex,javacard,Java,Signed,Hex,Javacard,我必须在java卡中使用INT,但由于卡本身不支持整数,所以我使用byte[] 为了以十六进制格式表示数字,我检查第一位,如果它是1-负,如果它是0-正(二进制)。因此,如果前导位小于8,则为正,否则为负(十六进制) 最高数字:7FFFFFFF 最低人数:800万 现在我想知道我是否想要比较一个值,例如00000001,如果它是高/低,我是否检查没有最高有效位(FFFFFFF>0000001>0000000)和分别检查最高有效位(如果>7=>负,否则=>正),还是有一个“更平滑”的值如何做到这一

我必须在java卡中使用INT,但由于卡本身不支持整数,所以我使用byte[]

为了以十六进制格式表示数字,我检查第一位,如果它是1-负,如果它是0-正(二进制)。因此,如果前导位小于8,则为正,否则为负(十六进制)

最高数字:7FFFFFFF

最低人数:800万


现在我想知道我是否想要比较一个值,例如00000001,如果它是高/低,我是否检查没有最高有效位(FFFFFFF>0000001>0000000)和分别检查最高有效位(如果>7=>负,否则=>正),还是有一个“更平滑”的值如何做到这一点?

有时您可能不希望有比较使用的开销。如果您只想比较字节数组中的两个有符号、两个补码、大端数字(默认的Java整数编码),则可以使用以下代码:

/**
 * Compares two signed, big endian integers stored in a byte array at a specific offset.
 * @param n1 the buffer containing the first number
 * @param n1Offset the offset of the first number in the buffer
 * @param n2 the buffer containing the second number
 * @param n2Offset the offset in the buffer of the second number
 * @return -1 if the first number is lower, 0 if the numbers are equal or 1 if the first number is greater
 */
public final static byte compareSignedInteger(
        final byte[] n1, final short n1Offset,
        final byte[] n2, final short n2Offset) {

    // compare the highest order byte (as signed)
    if (n1[n1Offset] < n2[n2Offset]) {
        return -1;
    } else if (n1[n1Offset] > n2[n2Offset]) {
        return +1;
    }

    // compare the next bytes (as unsigned values)
    short n1Byte, n2Byte;
    for (short i = 1; i < 4; i++) {
        n1Byte = (short) (n1[(short) (n1Offset + i)] & 0xFF);
        n2Byte = (short) (n2[(short) (n2Offset + i)] & 0xFF);

        if (n1Byte < n2Byte) {
            return -1;
        } else if (n1Byte > n2Byte) {
            return +1;
        }
    }
    return 0;
}
/**
*比较以特定偏移量存储在字节数组中的两个有符号的大端整数。
*@param n1包含第一个数字的缓冲区
*@param n1Offset缓冲区中第一个数字的偏移量
*@param n2包含第二个数字的缓冲区
*@param n2Offset第二个数字在缓冲区中的偏移量
*@return-1如果第一个数字较小,则为0,如果第一个数字较大,则为1
*/
公共最终静态字节比较整数(
最终字节[]n1,最终短n1偏移量,
最终字节[]n2,最终短字节(偏移量){
//比较最高顺序字节(带符号)
if(n1[n1偏移量]n2[n2Offset]){
返回+1;
}
//比较下一个字节(作为无符号值)
短n1Byte,n2Byte;
用于(短i=1;i<4;i++){
n1Byte=(短)(n1[(短)(n1Offset+i)]&0xFF);
n2Byte=(短)(n2[(短)(n2Offset+i)]&0xFF);
如果(n1Byten2Byte){
返回+1;
}
}
返回0;
}

请注意,此代码未经过优化,展开循环的速度可能更快,而且应该可以仅使用字节算术来完成此操作。

我猜您的意思是要比较两个值?如果是这样的话,标准的方法就是减去它们,看看结果符号是什么。我想知道一个数字是在边界之间,是正的还是负的什么边界?如果一个有符号的数字是32位,它就在7FFFFFFF和80000000之间——没有什么需要检查的。@UmNyobe-Darn。也许我会把它放在某个地方,X-mas 2013:P应该可以工作。用一百万个随机数测试,用最小值,-1,0,+1和最大值测试一百万次。偏移量未测试,但嘿。。。