我有一个数字,假设4是二进制表示为100,我想实现的是补充这个数字,即将1改为0和0为1。我能做到这一点
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这样的数字,会给出错误的结果。
System.out.println(~4);
outputs -5 , expected 3 发布于 2014-12-01 18:24:41
在时间复杂度方面,实现相同结果的最有效方法是什么?
假定int的大小固定在32,则时间复杂度为O(1)。但是,您的程序效率很低,因为它创建字符串的链接,进行字符串解析,等等。
如果完全跳过到二进制文件的转换,只需将数字反转,您就可以更快地做到这一点,如下所示:
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的所有位。
演示。
发布于 2014-12-01 18:23:10
您可以尝试使用按位否定:
private int flipBits(int n) {
return ~n;
}发布于 2014-12-01 18:29:49
为什么不这样做呢:
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行代码可以转换..。
https://stackoverflow.com/questions/27234680
复制相似问题