簡體   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