精华内容
下载资源
问答
  • java – 比较带符号的十六进制
    千次阅读
    2021-02-26 20:16:36

    我必须在

    java卡中使用int,但由于卡本身不支持整数,我使用byte []代替.

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

    最高人数:7FFFFFFF

    最低人数:80000000

    现在我想知道我是否想要比较一个值,例如. 00000001如果是高/低,是否在没有最高有效位(FFFFFFF> 0000001> 0000000)的情况下进行检查并单独检查最高有效位(如果> 7 =>负,否则=>正)或有一种“更顺畅”的方式吗?

    最佳答案 有时您可能不希望使用

    JCInteger given in this answer of mine进行比较的开销.如果您只想在字节数组中比较两个有符号,两个补码,大端数字(默认的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;

    }

    请注意,此代码未经过优化,展开循环可能会更快,并且应该可以使用字节算法来执行此操作.

    更多相关内容
  • 本程序主要是将十进制转十六进制函数(包括正负整数及小数),并根据设置显示大小端。输入参数说明:x表示十进制数,N表示最后转换成的十六进制数的位数(字节数),flag表示大小端(1是小端,2是大端)
  • 本程序主要是将十进制转十六进制函数(包括正负整数及小数),并根据设置显示大小端。 输入参数说明:x表示十进制数,N表示最后转换成的十六进制数的位数(字节数),flag表示大小端(1是小端,2是大端)
  • 此程序用于十六进制对比用处 同时拖动2个文件进去,可以查看到不一样的地方,以便于知道哪些地方改动过了
  • Golang 十六进制字符串与十进制数值比较大小

    Golang 十六进制字符串与十进制数值比较大小

    问题描述: 将表示十六进制数值的字符串类型
    (0xb6995e6b087fc99e0000)转换为uint类型,使用以下方法报错。

    func Hex2Dec(val string) uint64 {
    	val = val[2:]
    	n, _ := strconv.ParseUint(val, 16, 64)
    	return n
    }
    

    因为unit最大值为18446744073709551615,所以无法完成转换。

    故采用以下方法进行转换:

    通过 big.Int 将十六进制字符串转为十进制数值,再比较大小

    byteValue, err := hex.DecodeString("b6995e6b087fc99e0000")
    	if err != nil {
    		fmt.Println(err)
    	}
    	IntValue := new(big.Int).SetBytes(byteValue)
    	IntValue2 := new(big.Int).SetInt64(1000000000000000000)
    	fmt.Println("IntValue==>", IntValue)
    	fmt.Println("IntValue2==>", IntValue2)
    	fmt.Println(IntValue.Mul(IntValue, IntValue2))
    

    运行结果为:

    IntValue==> 862299855266560000000000
    IntValue2==> 1000000000000000000
    862299855266560000000000000000000000000000

    比较大小通过big.Int 自带方法Cmp,代码省略~~

    展开全文
  • C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。二进制数、八进制数和十六进制数的表示一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制...

    C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。

    二进制数、八进制数和十六进制数的表示

    一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。

    1) 二进制

    二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头,例如:

    //合法的二进制

    int a = 0b101; //换算成十进制为 5

    int b = -0b110010; //换算成十进制为 -50

    int c = 0B100001; //换算成十进制为 33

    //非法的二进制

    int m = 101010; //无前缀 0B,相当于十进制

    int n = 0B410; //4不是有效的二进制数字

    读者请注意,标准的C语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

    下面是实际测试的结果:

    Visual C++ 6.0 不支持。

    Visual Studio 2015 支持,但是 Visual Studio 2010 不支持;可以认为,高版本的 Visual Studio 支持二进制数字,低版本的 Visual Studio 不支持。

    GCC 4.8.2 支持,但是 GCC 3.4.5 不支持;可以认为,高版本的 GCC 支持二进制数字,低版本的 GCC 不支持。

    LLVM/Clang 支持(内嵌于 Mac OS 下的 Xcode 中)。

    2) 八进制

    八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o),例如:

    //合法的八进制数

    int a = 015; //换算成十进制为 13

    int b = -0101; //换算成十进制为 -65

    int c = 0177777; //换算成十进制为 65535

    //非法的八进制

    int m = 256; //无前缀 0,相当于十进制

    int n = 03A2; //A不是有效的八进制数字

    3) 十六进制

    十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头,例如:

    //合法的十六进制

    int a = 0X2A; //换算成十进制为 42

    int b = -0XA0; //换算成十进制为 -160

    int c = 0xffff; //换算成十进制为 65535

    //非法的十六进制

    int m = 5A; //没有前缀 0X,是一个无效数字

    int n = 0X3H; //H不是有效的十六进制数字

    4) 十进制

    十进制由 0~9 十个数字组成,没有任何前缀,和我们平时的书写格式一样,不再赘述。

    二进制数、八进制数和十六进制数的输出

    C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

    short

    int

    long

    八进制

    %ho

    %o

    %lo

    十进制

    %hd

    %d

    %ld

    十六进制

    %hx 或者 %hX

    %x 或者 %X

    %lx 或者 %lX

    十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

    %hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;

    %hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。

    八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。如果你比较叛逆,想使用大写形式,那么行为是未定义的,请你慎重:

    有些编译器支持大写形式,只不过行为和小写形式一样;

    有些编译器不支持大写形式,可能会报错,也可能会导致奇怪的输出。

    注意,虽然部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制,这一点比较遗憾。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。考虑到读者的基础还不够,这里就先不讲这种方法了。

    【实例】以不同进制的形式输出整数:

    #include

    int main()

    {

    short a = 0b1010110; //二进制数字

    int b = 02713; //八进制数字

    long c = 0X1DAB83; //十六进制数字

    printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形似输出

    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

    printf("a=%hx, b=%x, c=%lx\n", a, b, c); //以十六进制形式输出(字母小写)

    printf("a=%hX, b=%X, c=%lX\n", a, b, c); //以十六进制形式输出(字母大写)

    return 0;

    }

    运行结果:

    a=126, b=2713, c=7325603

    a=86, b=1483, c=1944451

    a=56, b=5cb, c=1dab83

    a=56, b=5CB, c=1DAB83

    从这个例子可以发现,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。

    输出时加上前缀

    请读者注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

    对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。

    对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。

    对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。

    区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

    #include

    int main()

    {

    short a = 0b1010110; //二进制数字

    int b = 02713; //八进制数字

    long c = 0X1DAB83; //十六进制数字

    printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c); //以八进制形似输出

    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

    printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c); //以十六进制形式输出(字母小写)

    printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c); //以十六进制形式输出(字母大写)

    return 0;

    }

    运行结果:

    a=0126, b=02713, c=07325603

    a=86, b=1483, c=1944451

    a=0x56, b=0x5cb, c=0x1dab83

    a=0X56, b=0X5CB, c=0X1DAB83

    十进制数字没有前缀,所以不用加#。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加#,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。

    展开全文
  • I am implementing a simple DHT using the Chord protocol in Java. The details are not important but the thing I'm stuck on is I need to hash strings and then see if one hashed string is "less than" ano...

    I am implementing a simple DHT using the Chord protocol in Java. The details are not important but the thing I'm stuck on is I need to hash strings and then see if one hashed string is "less than" another.

    I have some code to compute hashes using SHA1 which returns a 40 digit long hex string (of type String in Java) such as:

    69342c5c39e5ae5f0077aecc32c0f81811fb8193

    However I need to be able to compare two of these so to tell, for example that:

    0000000000000000000000000000000000000000

    is less than:

    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    This is the complete range of values as the 40 digit string is actually representing 40 hex numbers in the range 0123456789ABCDEF

    Does anyone know how to do this?

    Thanks in advance.

    解决方案

    The values 0..9 and A..F are in hex-digit order in the ASCII character set, so

    string1.compareTo(string2)

    should do the trick. Unless I'm missing something.

    展开全文
  • 十六进制加法逢十六进一 。一、具体例题[1] 3F+84 =?解:F+4=19逢16进一就变为3进一后(3+8=11)+1=12(C)结果:C3[2]3762H+05C3H=?解:2+3 = 5【不满16不进】6+12 = 18 【18-16=2(满16进1)】7+5=1212+1=13=D【1是上面...
  • 甲方使用的后台要求“整型数据采用小端传输”,大部分数据是4字节十六进制,有一些是2字节十六进制。关于大小端传输,简单来说可以这样认为。内存中低地址存最低有效字节的形式为小端传输内存中低地址存最高有效字节...
  • 个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...
  • 它显示十六进制和原始ASCII数据。 BinCoMerge正在寻找从大块到小块的通用块。 它以最小块大小(为2的幂)的级别工作,例如,文件大小在16 KiB和32 KiB之间时,Bincomerge首先会寻找所有大于16 KiB的公共块。 然后,...
  • 什么是十六进制?十六进制怎么转换?十六进制的定义16进制即逢16进1,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。故而有16进制每一位上可以是从小到大为0、1、2、3、4、5...
  • 1.十进制转十六进制 转换流程 1.每次取出 要转化的数 与 要转化的进制 的余数 2.将余数根据大小,转化成要对应进制的正确表达形式 3.将最后得到的字符串翻转 直接上代码 #include <iostream> #include ...
  • java 十六进制浮点 我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能,以减少代码重新格式化的可能性。 如果重新格式化,当前版本的代码将覆盖原本相同的代码。 这很烦人,因为按下重新格式化键的...
  • 十六进制转换为二进制很简单,我们首先要明白,一位十六进制代表四位二进制,如F对应二进制的1111,A代表二进制的1010,利用这种一一对应的关系,很容易就把十六进制转换为二进制,如0x1F6C,其中十六进制1对应二...
  • 十六进制令牌大小支持 Foundry VTT附加模块,允许对大小大于一个十六进制十六进制图块使用替代的捕捉逻辑,特别是对于TTRPG Lancer使用的令牌大小。 安装 请注意:此插件目前正在开发中。 它不包含所有预期的功能...
  • QByteArray at 和十六进制数的比较

    千次阅读 2020-06-28 18:56:30
    } 这个和十六进制比较经常使用到。 另外可以参考这篇文章: 关于QByteArray的>127的数字错误问题 ...
  • 十六进制转八进制

    千次阅读 2021-01-31 14:35:13
    接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式 输出n行,每行为输入对应的八进制正整数。 【注意】 输入的十六进制数不会有前导0,...
  • 16进制计算(十六进制计算器在线)

    千次阅读 2021-07-30 02:23:58
    定义16进制即逢16进1,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,...开始——所有程序——附件——计算器 查看——程序员 输入十进制数字然后点“十六进制” 转成16进制是6901. 十六进制照样采用...
  • 上节我们对二进制、八进制和十六进制进行了说明,本节重点讲解不同进制之间的转换,这在编程中经常会用到,尤其是C语言。 将二进制、八进制、十六进制转换为十进制 二进制、八进制和十六进制向十进制转换都非常...
  • 16进制 10进制00 001 102 2.. .09 90A 100B 110C 120D 130E 140F 1510 161F 3120 32将数字符号按序排列成数位,并遵照某种由低位到高位的进位 方式计数表示数值的方法,...
  • 蓝桥杯 十六进制转为八进制 C语言版

    千次阅读 多人点赞 2022-01-01 16:35:26
    蓝桥杯 十六进制转为八进制 ** 题目 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式  输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要...
  • 十六进制转八进制
  • 十六进制演示 可调整大小十六进制网格的演示。 受本文启发: : 要查看,请参阅演示 -
  • 速度由高到低:char[] (100ms),StringBuilder(250ms),StringBuilder + Integer.toHexString(1200ms),(100000次)代码:importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;...
  • 我们在课本的学习中,几乎用到的都是数制,像二进制、八进制、十进制、十六进制都是数制。 举个例子二进制 10010 我们知道它表示的数值大小是 18。(十进制下) 码制:表示事物的规则 码制就是用数字来表示具体...
  • 将文本字段的值从十六进制转换为小端的公式是什么?输入示例:5A109061输出示例:1636831322解决方法:>从EditText作为字符串获取值.>使用Integer.parseInt(…)和基数16将字符串值解析为十六进制.>使用...
  • 二进制和十六进制

    千次阅读 2018-08-16 08:40:17
    课程导言 【最早的编程语言是二进制语言,也是计算机能够直接...通过本篇的学习,你将了解到为什么计算机能够直接识别二进制语言,二进制的计数原理以及与十进制、十六进制之间的数值转换。】   在讲述二进制之...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,936
精华内容 52,774
关键字:

十六进制比较大小