Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @HackerRank:FlippingBits。错误输出_Java - Fatal编程技术网

Java @HackerRank:FlippingBits。错误输出

Java @HackerRank:FlippingBits。错误输出,java,Java,这一次真的让我很难过。所以最终我决定从你们这里得到一些帮助。也许,你可以回顾一下,告诉我哪里出了问题 @ 基本上: 输入=数字 将其转换为二进制字符串 翻转位(设置所有0并重置所有1) 输出这样做得到的数字 我现在已经硬编码了一个数字,正如在报告中提到的那样 问题(=2147483647) 问题是:它给了我一个输出: 0 代码: 公共类翻转位{ 专用静态字符串翻转位(字符串二进制格式){ 字符串flippedString=“”; 对于(int i=0;i将数字转换为字符串的方式: Long.t

这一次真的让我很难过。所以最终我决定从你们这里得到一些帮助。也许,你可以回顾一下,告诉我哪里出了问题

@

基本上:

输入=数字

  • 将其转换为二进制字符串
  • 翻转位(设置所有0并重置所有1)
  • 输出这样做得到的数字
  • 我现在已经硬编码了一个数字,正如在报告中提到的那样 问题(=2147483647)

    问题是:它给了我一个输出:

    0
    
    代码:

    公共类翻转位{
    专用静态字符串翻转位(字符串二进制格式){
    字符串flippedString=“”;
    
    对于(int i=0;i将数字转换为字符串的方式:

    Long.toBinaryString(num)
    
    不会在数字前加0,因此例如
    3
    将是
    11
    ,而不是
    00000000000000000000000000000011
    。因此,您的翻转方法不会像黑客银行的人希望的那样工作

    请注意,问题指出整数是32位长的(在某个地方,不是很清楚,但很好),所以您需要考虑到这一点

    @编辑:最简单的填充方法是:

    numBinaryString = String.format("%32s",numBinaryString).replace(" ", "0")
    

    代码没有问题。如果您尝试将长数2147483647转换为二进制数,您将得到1111111111111111

    当你翻转它时,你得到零,这是正确的

    除此之外,您可以使用以下命令,而不是使用
    getNum
    从二进制数手动创建十进制数:

    System.out.println(Long.parseLong(flippedString, 2));
    

    我建议您首先尝试使用较小的数字,比如10,然后看看如何从中得到5。

    因为Java没有无符号类型,并且以2的补码形式解释整数,所以您需要同时解决这两个问题

    对于第一点,我们可以使用
    long
    来存储值。对于第二点,我们可以使用
    0x00000000ffffffff
    进行位掩码,并获得所需的32位部分

    int original = 1;
    long flipped = ~original & 0x00000000ffffffffL;
    System.out.println(flipped); 
    
    // outputs 4294967294
    

    Java有一些工具来处理上面提到的任务——除非我必须这样做,否则我不会突然进行
    字符串操作。

    你已经得到了一些答案,但让我给你一个替代方法

    使用long来存储该值,然后可以使用0xFFFFFFFFFFL(二进制格式为11111111111111111111111)对其进行异或运算。这将为您提供正确答案

    例如:

    00000000000000000000000000000001
    11111111111111111111111111111111 ^
    --------------------------------
    11111111111111111111111111111110
    
    请注意,我使用自定义IO方法

    long n = in.readLong() ^ 0xffffffffL;
    out.print(n + "\n");
    

    你试过使用调试器吗?我注意到,你知道怎么做吗?你可以自己添加缺少的0,或者使用不同的方法将数字转换成二进制字符串。
    long n = in.readLong() ^ 0xffffffffL;
    out.print(n + "\n");