32-bit signed integer java_用于32位带符号二进制字符串的Java Integer.parseInt()会引发NumberFormatException...

Integer.valueOf(String,int radix)和Integer.parseInt(String,int radix)将仅解析值-2 147 483 648到2 147 483 647的数字,即32位有符号整数的值.

这些函数不能解释二进制的二进制补码(radix = 2),因为传递的字符串可以是任意长度,因此前导1可以是数字或符号位的一部分.我猜Java开发人员认为最合乎逻辑的方法是永远不要接受二进制补码,而不是假设第32位是符号位.

它们将输入二进制字符串读取为无符号3 549 763 730(大于max int值).要读取负值,您需要在前面给出带有 – 符号的正二进制数.例如-5:

Integer.parseInt("1011",2); // 11

// Even if you extended the 1s to try and make two's complement of 5,// it would always read it as a positive binary value

Integer.parseInt("-101",2); // -5,this is right

我建议,首先,如果您可以将其存储为带有额外标志信息的正数(例如 – 符号),请执行此操作.例如:

String binString;

if(i < 0)

binString = "-" + Integer.toBinaryString(-i);

else // positive i

binString = Integer.toBinaryString(i);

如果你需要使用带符号的二进制字符串,为了以二进制二进制补码形式(作为字符串)取一个负数并将其解析为int,我建议你手动取两个补码,将其转换为int,然后更正标志.回想一下,两个补码=一个补码1,一个补码只是反转每个位.

作为示例实现:

String binString = "11010011100101010001100010010010";

StringBuilder onesComplementBuilder = new StringBuilder();

for(char bit : binString.tocharArray()) {

// if bit is '0',append a 1. if bit is '1',append a 0.

onesComplementBuilder.append((bit == '0') ? 1 : 0);

}

String onesComplement = onesComplementBuilder.toString();

System.out.println(onesComplement); // should be the NOT of binString

int converted = Integer.valueOf(onesComplement,2);

// two's complement = one's complement + 1. This is the positive value

// of our original binary string,so make it negative again.

int value = -(converted + 1);

您也可以为32位二进制补码二进制数编写自己的Integer.parseInt版本.当然,这假设您没有使用Java 8,并且不能只使用Integer.parseUnsignedInt,@llogiq在我输入时指出了它.

编辑:您也可以先使用Long.parseLong(String,2),然后计算二进制补码(并将其掩盖为0xFFFFFFFF),然后将长整数降级为int.编写速度更快,代码可能更快.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值