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