【问题标题】:Decimal to Binary with two complement带两个补码的十进制到二进制
【发布时间】:2019-02-25 13:06:19
【问题描述】:

我尝试将十进制转换为二进制,如下所示: 我得到了输入 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];
}

【问题讨论】:

  • 那是因为它们不是比特,它们是ints。如果int 存储0 并且您将其所有位反转为二进制补码,您确实会得到-1
  • binary[i] = 1 - binary[i]; 可能是你想要的。

标签: c++ binary


【解决方案1】:

你快到了。

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

然后,要否定一个二进制补码,你需要

  1. 反转它
  2. 添加1 (why)

例如:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2017-03-16
    • 2014-11-03
    • 2015-10-26
    • 2013-09-28
    相关资源
    最近更新 更多