这个真的给了我很多困难。所以最终我决定从你们那里得到一些帮助。也许,你可以查看它并告诉我哪里出错了。
@ https://www.hackerrank.com/challenges/flipping-bits
基本上:
输入=数字
- 将其转换为二进制字符串。
- 翻转位(设置全0并重置全1)
- 输出您获得的数字。
醇>我现在已经对一个数字进行了硬编码,正如在中提到的那样 问题(= 2147483647)
问题是:它给了我一个输出:
0
代码:
public class FlippingBits {
private static String flipBits(String binaryOrig){
String flippedString = "";
for(int i = 0; i<binaryOrig.length(); i++){
if(binaryOrig.charAt(i) == '1')
flippedString += '0';
else
flippedString += '1';
}
return flippedString;
}
private static long getNum(String flippedString){
long new_number = 0;
for(int i = 0; i < flippedString.length(); i++){
new_number = (2*new_number) + (flippedString.charAt(i) - '0');
}
return new_number;
}
public static void main(String[] args) {
long num = 2147483647;
String numBinaryString = Long.toBinaryString(num);
String flippedString = flipBits(numBinaryString);
System.out.println(Long.toString(getNum(flippedString)));
}
};
谁能告诉我什么是错的!这是在尝试3-4小时后。对不起,如果它是微不足道的。
提前致谢。
编辑:问题的摘录:
“以1为例,因为无符号32位是
00000000000000000000000000000001
并且正在进行翻转
11111111111111111111111111111110
反过来又是4294967294“
所以,我感觉它必须做长期64位的事情。 !?
答案 0 :(得分:4)
因为Java没有无符号类型,并以两种补码的形式解释整数,所以你需要解决这两种问题。
首先,我们可以使用long
来存储值。对于第二点,我们可以使用0x00000000ffffffff
进行位掩码并获得我们想要的32位部分。
int original = 1;
long flipped = ~original & 0x00000000ffffffffL;
System.out.println(flipped);
// outputs 4294967294
如上所述,Java有处理这样的任务的工具 - 除非必要,否则我不会进行String
操作。
答案 1 :(得分:2)
您将数字转换为字符串的方式:
Long.toBinaryString(num)
不会在数字前加0,因此例如3
将是11
而不是00000000000000000000000000000011
。因此,你的翻转方法将无法像hackerrank的那些人那样工作。
请注意,问题表明整数是32位长(某处但不是很清楚,但很好),所以你需要考虑到这一点。
@Edit:最简单的填充方法是:
numBinaryString = String.format("%32s",numBinaryString).replace(" ", "0")
答案 2 :(得分:0)
代码没有错。如果您尝试将长号码2147483647转换为二进制数,您将获得1111111111111111111111111111111。
当你翻转它时,你会得到零,这是正确的。
除此之外,您可以使用:{/ p>而不是使用getNum
从二进制数手动创建小数。
System.out.println(Long.parseLong(flippedString, 2));
我建议你首先尝试使用较小的数字,比如10,然后看看你是如何获得5的。
答案 3 :(得分:0)
你已经有了一些答案,但让我给你另一种方法。
使用long存储该值,然后您可以使用0xffffffffL(二进制的11111111111111111111111111111111)对其进行异或。这会给你正确的答案。
例如:
sys.platform
您可以在下面找到代码。请注意,我使用自定义IO方法。
00000000000000000000000000000001
11111111111111111111111111111111 ^
--------------------------------
11111111111111111111111111111110