繁体   English   中英

如何限制十进制到二进制转换器中显示的二进制数?

[英]how do i limit the binary displayed in my decimal to binary converter?

到目前为止我有这个代码:

for ( int i = 16; i >=0; i--){
   int k = n >> i;
   if (k & 1)
     printf("1");
   else
     printf("0");
}

我对 C 非常陌生,我正在研究一个班级的十进制到二进制转换器。 到目前为止,这是我发现在我的参数范围内工作的内容。 唯一的问题是我需要此代码仅将二进制文件输出到给定的 MSD。

如果我有十进制 15,它应该以二进制显示 1111,如果我有十进制 16,它应该只显示下一组 4,所以 00010000。

截至目前,我可以将数量设置为我想要的任何值,如 i = 16,但这将显示总共 15 个空格。 好像我输入了一个小数,我不希望我的程序显示所有额外的不必要的 0。

那么有没有办法限制二进制输出以与准确显示其转换所需的最重要空间相对应?

要将其按 4 组进行排序,您需要一点一点地工作。 打印半字节(值 0 到 15 dec)的函数可能如下所示:

void print_bin_nibble (uint8_t ls_nibble)
{
  for(size_t i=0; i<4; i++)
  {
    uint8_t bitmask = 1u << (4-1-i);
    printf("%c", (ls_nibble & bitmask) ? '1' : '0');
  }
  printf(" ");
}

现在,如果您想按半字节打印数据,同时跳过等于 0000 bin 的半字节的前导零,您需要跟踪是否应该使用布尔标志跳过打印。 逻辑是:

if(nibble==0 && remove_zeroes)
{
  ; // do nothing
}
else
{
  remove_zeroes = false;
  print_bin_nibble(nibble);
}

可以改写为(德摩根定律):

if(nibble != 0 || !remove_zeroes)
{
  remove_zeroes = false;
  print_bin_nibble(nibble);
}

打印数字时的进一步考虑是 CPU 字节序。 我们可以通过多种(不好的)方式逐字节迭代整数,例如使用指针算术或联合。 但是输出将依赖于字节序并且在小字节序机器上看起来很奇怪。 通过使用位移位,我们完全消除了这个可移植性问题,因为它们与字节序无关。

例如,给定一个 32 位整数 u32,我们可以像这样屏蔽掉单个字节:

(u32 >> (24-n*8)) & 0xFF

其中n是字节数 0 到 3。我们最终将 n=0 移位 24 位,n=1 移位 16 位,n=2 移位 8 位,n=3 移位 0 位。

完整示例:

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

void print_bin_nibble (uint8_t ls_nibble)
{
  for(size_t i=0; i<4; i++)
  {
    uint8_t bitmask = 1u << (4-1-i);
    printf("%c", (ls_nibble & bitmask) ? '1' : '0');
  }
  printf(" ");
}

void print_bin32 (uint32_t u32)
{
  bool remove_zeroes = true;

  for(size_t i=0; i<sizeof(u32); i++)
  {
    uint8_t byte = (u32 >> (24-i*8)) & 0xFF;
    uint8_t nibble;

    nibble = (uint32_t)byte >> 4;
    if(nibble != 0 || !remove_zeroes)
    {
      remove_zeroes = false;
      print_bin_nibble(nibble);
    }

    nibble = byte & 0xF;
    if(nibble != 0 || !remove_zeroes)
    {
      print_bin_nibble(nibble);
    }
  }
  printf("\n");
}

int main (void)
{
  print_bin32(16);
  print_bin32(0xDEADBEEF);
  print_bin32(0xABBA);
}

输出:

0001 0000
1101 1110 1010 1101 1011 1110 1110 1111
1010 1011 1011 1010

一种方法是使用一个标志变量来检查我们是否有一个非零的 msb,并且只有在我们遇到一个非零的 msb 后才开始打印 0,例如

int flag
for ( int i = 16; i >=0; i--)
{
int k = n >> i;

if (k & 1){
  printf("1");
  flag = 1;
}else{
  if(flag)
    printf("0");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM