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

C 如何使用位掩码将十六进制数转换为二进制数,c,binary,hex,C,Binary,Hex,加上显示此数字的二进制表示形式, 以及二进制数中0和1的计数。 我找到了其他转换方法,但不是使用位掩码。问题可能是您的位掩码使用了double。我认为>>对于双打没有多大意义,尤其是因为它们由符号位、尾数和2^指数组成 例如,8>>1等于4。这是一个很好的一致性操作,与除以2相同 为了简单起见,如果我们设想一个无符号的两字节浮点,并设想第一个字节表示尾数,第二个字节表示无符号的指数,那么7*2^4=112可以表示为0B000000111 00000100。如果你把1向右移动,>>1,你会得到0b

加上显示此数字的二进制表示形式, 以及二进制数中0和1的计数。
我找到了其他转换方法,但不是使用位掩码。问题可能是您的位掩码使用了double。我认为>>对于双打没有多大意义,尤其是因为它们由符号位、尾数和2^指数组成

例如,8>>1等于4。这是一个很好的一致性操作,与除以2相同

为了简单起见,如果我们设想一个无符号的两字节浮点,并设想第一个字节表示尾数,第二个字节表示无符号的指数,那么7*2^4=112可以表示为0B000000111 00000100。如果你把1向右移动,>>1,你会得到0b00000011 1000010,按照我们的惯例现在是3*2^130。这绝对不是将整数右移1得到的除以2的结果

我的编译器给出错误:如果我尝试按位移位浮点数,则二进制>>的无效操作数具有双精度和无符号

因此,基本上您可以尝试以下方法:

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

我把它重新标记为C,而不是C,因为C中没有printf。
#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;
}