有没有宣布在Java中一个unsigned int的方法吗?
或者,这个问题也可以被诬陷为这样的:什么是Java等同的签名?
只是为了告诉你,我一直在寻找在Java的实现String.hashcode()
的情况下。我想测试碰撞的可能性,如果该整数为32 unsigned int类型。
Java没有对unsigned integers数据类型。
您可以定义一个long
代替int
的,如果你需要存储较大的值。
您还可以使用有符号整数,就好像它是无符号。 two's complement representation的好处是,大多数操作(如加,减,乘,和左移位)是对符号和无符号的整数二进制电平是相同的。一些操作(师,右移,比较和铸造),但是,是不同的。从Java SE 8,在Integer
类新的方法让您充分使用int
数据类型to perform unsigned arithmetic:
在Java SE 8和更高版本中,可以使用int数据类型来表示一个32位无符号整数,其具有最小值0和2 ^ 32-1的最大值。使用Integer类使用int数据类型为无符号整数。像
compareUnsigned
,divideUnsigned
等静态方法已被添加到Integer类支持算术运算的无符号整数。
需要注意的是int
宣告但无符号运算,现在可以通过使用Integer
类的方法时,变量仍签署。
有很好的答案在这里,但我看不出位操作的任何示威活动。像维瑟(目前公认的答案)说,Java的标志默认整数(Java的8具有无符号整数,但我从来没有使用过)。事不宜迟,让我们开始吧......
如果你需要写一个无符号整数IO会发生什么?实际的例子是,当你根据RFC 868要输出的时间。这需要32位,大端,无符号整数自上午12点00编码的秒数1900年1月1日,你将如何编码呢?
声明的4个字节的字节阵列(2 ^ 31个比特)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
现在你有(如果你想破坏的破坏或小端),以填补在大端顺序信息的阵列中的每个字节。假设你有一个长期包含时间(长整数都是64位长在Java中)被称为secondsSince1900
(其中仅使用前32位的价值,并且您已经处理的事实,日期的引用12:00 AM 1970年1月1日),那么你可以使用逻辑与从中提取位,这些位转移到位置(位)时coersed成字节,将是不容忽视的,而在大端顺序。
my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed
我们my32BitUnsignedInteger
是相当于现在的32位无符号,大端整数附着在RCF 868标准。是的,长期的数据类型是有符号的,但我们忽略了这个事实,因为我们假定secondsSince1900仅用于低32位)。因为coersing长为一个字节的所有位高于2 ^ 7(前两个十六进制数字)将被忽略。
来源参考:Java网络编程,第4版。
您可以使用Math.abs(数字)功能。它返回一个正数。
无论是在一个int值带有符号取决于如何位被解释 - Java的解释为符号值位(它不具有签名原语)。
如果你要解释为无符号值的int(例如你读,你知道包含一个无符号值一个DataInputStream一个int),那么你可以做下面的技巧。
int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffl;
请注意,这是很重要的十六进制文字是一个长期的文字,而不是一个int文本 - 因此,“L”结尾。
我们需要的无符号数来模拟MySQL的无符号TINYINT
,SMALLINT
,INT
,BIGINT
在jOOQ,这就是为什么我们创建jOOU,简约库,提供包装类在Java中的无符号整数。例:
import static org.joou.Unsigned.*;
// and then...
UByte b = ubyte(1);
UShort s = ushort(1);
UInteger i = uint(1);
ULong l = ulong(1);
所有这些类型的延伸java.lang.Number
和可以转化成更高阶的基本类型和BigInteger
。希望这可以帮助。
(声明:我这些库背后的公司工作)
对于无符号数,你可以使用这些类从Guava library:
它们支持各种操作:
这似乎在目前缺少的东西是字节移位运算符。如果你需要那些可以从Java使用的BigInteger。
使用char
16位无符号整数。
看来你可以处理做一个“逻辑与”签约问题上的值使用它们之前:
实施例(的byte[]
header[0]
值是0x86
):
System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));
结果:
Integer -122 = 134
也许,这就是你的意思?
long getUnsigned(int signed) {
return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
getUnsigned(0)
→0getUnsigned(1)
getUnsigned(Integer.MAX_VALUE)
2147483647getUnsigned(Integer.MIN_VALUE)
2147483648getUnsigned(Integer.MIN_VALUE + 1)
2147483649刚才这一段代码,至极“this.altura”由负转变为正数。希望这可以帮助别人需要
if(this.altura < 0){
String aux = Integer.toString(this.altura);
char aux2[] = aux.toCharArray();
aux = "";
for(int con = 1; con < aux2.length; con++){
aux += aux2[con];
}
this.altura = Integer.parseInt(aux);
System.out.println("New Value: " + this.altura);
}