2016-11-22 55 views
2

我正在使用处理2.2.1。当我尝试在32位整数上使用unbinary()时,除了第一个以外,每个位都可以翻转。处理非二进制函数的问题

例如,

int output = unbinary("10000000000000000000000000000000"); 

这会抛出:

"NumberFormatException: For input string: "10000000000000000000000000000000" 

是否unbinary()不能处理32位整数?

回答

2

Processing's source,该unbinary()功能引擎盖下称Integer.parseInt()。根据the Java APIInteger.parseInt()函数需要一个有符号的值。这是一个问题,因为32位int没有符号,他们有符号位

换句话说,该unbinary()功能不被治疗你输入32位的值相同的方式的Java(和因此处理)将治疗32位int。

int可容纳的最大数字为2,147,483,647。您输入的二进制值转换为2,147,483,648,这超过了限制。

但值是一个32位数的二进制数!这不是一个32位整数?

unbinary()函数将二进制值视为“人类可读的”,这意味着它期望负号的符号。所以它接受像-101这样的东西来表示-5二进制。但在引擎盖下,这不是如何处理二元负值。 Java使用two's complement来表示负数,这意味着-5由二进制表示为11111111111111111111111111111011

它变得有点复杂,但基本上是:如果一个二进制数与1开始,这意味着它是一个负数。

所以,10000000000000000000000000000000您输入的数值计算仅在机器可读的格式可能的最低值int-2,147,483,648unbinary()函数将它视为“可读性”格式,这就是为什么你会得到这种差异。

我该如何解决这个问题?

这真的取决于你为什么需要从二进制到整数。但你可以使用Integer.parseUnsignedInt()函数,它采用“机器可读”格式的二进制值:

int output = Integer.parseUnsignedInt("10000000000000000000000000000000", 2); 
+0

方式比我更快,也很详细:好的! (+1) –

+0

谢谢@George!起初,这个让我挠了挠头。我始终难以在脑中保留二进制文件! –