如何使用位掩码将十六进制数转换为二进制数

时间:2016-03-29 17:05:42

标签: c binary hex

int main()
{
    double hexa_number;
    double bitmask = 0x80;
    double i;
    printf("Enter 8 bit number in hexadecimal form: ");
    scanf("%lf",& hexa_number);
    for( i = 0; i <= 8; i++)
    {
        if(hexa_number&(bitmask >> i))
            printf("1");
        else
            printf("0");
    }
    return 0;
}

plus显示此数字的二进制表示,   以及二进制数中0和1的数量的计数。   我找到了转换它的其他方法,但没有使用位掩码

1 个答案:

答案 0 :(得分:0)

问题可能在于您使用双重作为位掩码。我不认为&gt;&gt;对双打很有意义,特别是因为它们由符号位,尾数和2 ^指数组成。

例如,8&gt;&gt; 1是4.这是一个很好的一致操作,与除以2相同。

如果为了简单起见我们想象一个无符号的两字节浮点数并想象第一个字节表示尾数而第二个字节表示指数(均为无符号),那么7 * 2 ^ 4(= 112)可以表示为0b00000111 00000100。你将那个1移到右边,&gt;&gt; 1,你将获得0b00000011 10000010,按我们的惯例现在是3 * 2 ^ 130。这肯定不是通过将整数右移1而获得的除法。

我的编译器给出&#34;错误:二进制的无效操作数&gt;&gt; (有双重和未签名)&#34;如果我尝试逐位移位浮点数。

所以基本上你可以尝试以下方法:

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

int main()
{
    int hexa_number = 0;
    unsigned num_bits = sizeof(int)*8;
    unsigned bitmask = 1 << (num_bits - 1);
    printf("Enter a number in hexadecimal form: ");
    scanf("%i", &hexa_number);

    unsigned k = 0;
    unsigned num_ones = 0;
    unsigned num_zeros = 0;

    for(k = 0; k != num_bits; k ++)
    {
        if(hexa_number & (bitmask >> k))
        {
            printf("1");
            num_ones ++;
        }
        else
        {
            printf("0");
            num_zeros++;
        }
    }
    printf("\nNumber of ones is %i\nNumber of zeros is %i", num_ones, num_zeros);
    return 0;
}