我尝试像这样将十进制转换为二进制: 我得到了输入 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
(原因)
例如:
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;
}
}