首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制补码0到1,1到0

二进制补码0到1,1到0
EN

Stack Overflow用户
提问于 2014-12-01 18:19:25
回答 4查看 1.4K关注 0票数 1

我有一个数字,假设4是二进制表示为100,我想实现的是补充这个数字,即将1改为0和0为1。我能做到这一点

代码语言:javascript
复制
public class Foo {
    public static void main(String[] args) {
        String binaryString = Integer.toBinaryString(4);

        StringBuilder out = new StringBuilder();
        char[] chars = binaryString.toCharArray();
        char x;
        for (char ch : chars) {
            if (ch == '1') {
                x = '0';
            } else {
                x = '1';
            }
            out.append(x);
        }
        System.out.println(Integer.parseInt(out.toString(), 2));
    }
}

在时间复杂度方面,实现相同结果的最有效方法是什么?请注意,输入可能是非常大的数字,我们需要处理整数溢出。

更新的否定了一个像~n这样的数字,会给出错误的结果。

代码语言:javascript
复制
System.out.println(~4); 
outputs -5 , expected 3 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-01 18:24:41

在时间复杂度方面,实现相同结果的最有效方法是什么?

假定int的大小固定在32,则时间复杂度为O(1)。但是,您的程序效率很低,因为它创建字符串的链接,进行字符串解析,等等。

如果完全跳过到二进制文件的转换,只需将数字反转,您就可以更快地做到这一点,如下所示:

代码语言:javascript
复制
int val = 4;
int msb = int msb = 32 - Integer.numberOfLeadingZeros(val);
int inverse = ~val & ((1 << msb)-1);
System.out.println(inverse);

~运算符是一个一元运算符,它生成值的二进制补码。循环计算最重要位(MSB)的位置。((1 << msb)-1)是一个掩码,它删除高于MSB的所有位。

演示。

票数 3
EN

Stack Overflow用户

发布于 2014-12-01 18:23:10

您可以尝试使用按位否定:

代码语言:javascript
复制
private int flipBits(int n) {
     return ~n;
}
票数 1
EN

Stack Overflow用户

发布于 2014-12-01 18:29:49

为什么不这样做呢:

代码语言:javascript
复制
public static void main(String[] args) {
        String binaryString = Integer.toBinaryString(4);
        binaryString = binaryString.replaceAll("1", "-");
        binaryString = binaryString.replaceAll("0", "1");
        binaryString = binaryString.replaceAll("-", "0");

只有3行代码可以转换..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27234680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档