使用2的补码从int转换为二进制字符串到int

时间:2012-12-04 22:59:28

标签: c binary int bit-manipulation twos-complement

我知道有一个二进制字符串10001110正在使用2的补码。我知道它将是8位。

unsigned int的形式给予我,等于142.

然后我需要将其转换回10001110

然后反转所有位并添加一个等于01110010

的位

然后将其转换为signed int等于-114。

我该怎么做?我对C比较陌生,并且花了很多时间试图解决这个问题!

基本上我想编写一个取unsigned int 142并返回signed int -114

的函数

5 个答案:

答案 0 :(得分:2)

您无需更改位模式。您只需要签名扩展以匹配signed int结果的位长度。最简单的方法是检查输入的符号位,然后或者如果设置的话,用比特长度向左筛选-1。

int toSignedInt(unsigned int value, int bitLength)
{
    int signedValue = value;
    if (value >> (bitLength - 1))
        signedValue |= -1 << bitLength;
    return signedValue;
}

<强>解释

在8位二进制补码中,无符号142和有符号-114的位模式相同。因此,如果您的整数类型是8位,您只需要转换类型。但是,如果你有32位整数,但是你想把它们视为8位二进制补码,那么你需要将左手24位设置为1,如果符号位是1。

答案 1 :(得分:2)

考虑一下使用按位运算符可以做些什么。您可以像这样测试一个位是1还是0:

int bit = value & 1;

您也可以将int中的位移位:

val = val >> 1;

要测试int中的第i位,你可以这样做:

int bit = (value >> i) & 1;

因此,使用这些信息,您可以将给定的整数转换为二进制并将其存储在一个char数组中(如果你计算在内,它将按相反的顺序排列!)然后根据您的喜好操作char。希望这是一个足够大的暗示让你站起来并开始。

答案 2 :(得分:0)

难道你不能从你给出的任何值中减去256吗?

答案 3 :(得分:0)

老兄 - 你为什么要关闭原来的问题????

我的回答与第一个相同:

  • 整数是整数。无论是“签名”还是“未签名”;无论是“补充”还是“补充” - 这些位总是相同的。

  • 如果您想将签名值“转换”为无符号值,C cast通常是最好,最简单,最有效和最清晰的方法(下面的代码示例)。

  • 绝大多数CPU架构都是两个补充

  • 如果出于某种原因,您想要检查您的CPU架构是否是补充,那么只需测试-0 == +0。二进制补码不 “负零”(仅为零)。一致补充。

PS:

  

问:基本上我想编写一个带有unsigned int的函数   142并返回signed int -114

A:

int silly_convert (int i)
{
  return (signed char)i;
}

这与我在原帖中的回复完全相同。

答案 4 :(得分:-1)

这是我最终提出的解决方案。

#include <stdio.h>
#include <stdlib.h>

int getBit(int no, int bit) // get bit at certain position
{
    bit--;
    return (no & (1 << bit)) >> bit;
}

void complementNBits(int *no, int count) // invert certain number of bits
{
    int i;
    for(i=0; i<count; i++)
    {
        *no ^= 1 << i;
    };
}

int main() 
{
    unsigned int unsignedNo=142;

    int negative = 0;   
    signed int signedNo=0;

    // check if MSB is set to determine if negative

    if (getBit(unsignedNo, 8)) // if MSB is set
    {
        negative = 1;
        // invert these 8 bits and add 1. the rest of the MSBs will already be 0
        complementNBits(&unsignedNo, 8);
        unsignedNo++;
    }

    signedNo = unsignedNo;
    if (negative)
    {
        signedNo = signedNo * -1;
    }

    printf("THE SIGNED INTEGER: %i\n", signedNo);

}

感谢大家的帮助!