十进制到二进制,有两个补码



我尝试像这样将十进制转换为二进制: 我得到了输入 int 和一个二进制 int。

int rem;
int bin[32] = {0};
for(int i=0; input != 0; i++) { //making array of binary, but reversed
rem = input%2;
bin[i] = abs(rem);
input = input / 2;
}
for(int i = 0; i < 32; i++) { //reversed binary is put in correct order
binary[i] = bin[31 - i];
}

现在我希望如果输入是负数,如"-5",它给了我两个补码。

当试图用"~"补充每个位时,他们会以某种方式转向"-1"。

for (int i = 0; i < 32; i++) {
binary[i] = ~binary[i];
}

你快到了。

你每int存储一个位,所以你只需要翻转该位,例如^ 1(XOR 1)。这样 0 变成 1,1 变成 0。波浪号运算符~将翻转所有位,因此 0 变为 -1,1 变为 -2(即不是您想要的)。

然后,要否定二的补码数,您需要

  1. 反转它
  2. 添加1(原因)

例如:

for (int i = 0; i < 32; i++) {
binary[i] ^= 1;
}
for (int i = 31; i >= 0; i--) {
binary[i] ^= 1;
if (binary[i])
break;
}

或者将这两个步骤合并为一个步骤:

for (int i = 31, carry = 0; i >= 0; i--) {
if (carry || !binary[i]) {
binary[i] ^= 1;
carry = 1;
}
}

最新更新