【问题标题】:how can i convert hexadecimal number to binary using bit-mask如何使用位掩码将十六进制数转换为二进制数
【发布时间】:2016-07-17 09:13:09
【问题描述】:
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 的数量。 我找到了其他方法来转换它,但不是用位掩码

【问题讨论】:

  • 我已将其重新标记为 C,而不是 C#,因为 C# 中没有 printf

标签: c binary hex


【解决方案1】:

问题可能是您使用双精度位掩码。我认为 >> 对于双精度数没有多大意义,特别是因为它们由符号位、尾数和 2^ 指数组成。

例如,8 >> 1 是 4。这是一个很好的一致运算,与除以 2 相同。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多