簡體   English   中英

打印長的二進制64位表示形式

[英]Printing a long in binary 64-bit representation

我正在嘗試打印long的二進制表示形式,以便練習位操作並為我正在研究的項目在long中設置各種位。 我可以成功打印int上的位,但是每當我嘗試打印64位長的輸出時,輸出都是錯誤的。 這是我的代碼:

#include <stdio.h> 

void printbits(unsigned long n){
    unsigned long i; 
    i = 1<<(sizeof(n)*4-1);
    while(i>0){
         if(n&1)
              printf("1"); 
         else 
              printf("0"); 
         i >>= 1; 
}

int main(){
    unsigned long n=10; 
    printbits(n); 
    printf("\n"); 
}

我的輸出是0000000000000000000000000000111111111111111111111111111111111110.謝謝!

  • 4個字節的位數不正確
  • 即使您將其分配給unsigned long1 << …還是一個int ,因此您需要1UL
  • n&1應該是n&i
  • 缺少右括號

僅修復:

#include <limits.h>
#include <stdio.h> 

void printbits(unsigned long n){
    unsigned long i; 
    i = 1UL<<(sizeof(n)*CHAR_BIT-1);
    while(i>0){
         if(n&i)
              printf("1"); 
         else 
              printf("0"); 
         i >>= 1;
    }
}

int main(){
    unsigned long n=10; 
    printbits(n); 
    printf("\n"); 
}

而且,如果您要專門打印一個64位數字,我將對64進行硬編碼並使用uint_least64_t

問題是,由於多種原因, i = 1<<(sizeof(n)*4-1)不正確。

  1. sizeof(n)*4是32,而不是64。您可能想要sizeof(n)*8
  2. 1<<63可能會給您帶來溢出,因為默認情況下1可能是32位。 您應該使用1ULL<<(sizeof(n)*8-1)
  3. unsigned long不一定是64位。 您應該使用unsigned long long

如果要更徹底,請使用sizeof(n) * CHAR_BIT (在<limits.h>定義)。

通常,應盡可能使用stdint定義(例如uint64_t )。

以下應該做您想要的:

#include <stdio.h>

void printbits(unsigned long number, unsigned int num_bits_to_print)
{
    if (number || num_bits_to_print > 0) {
        printbits(number >> 1, num_bits_to_print - 1);
        printf("%d", number & 1);
    }
}

我們一直遞歸地調用該函數,直到我們打印了足夠的位,或者我們打印了整數(以占用更多位為准)為止。

將其直接包裝到另一個函數中可以完全滿足您的要求:

void printbits64(unsigned long number) {
    printbits(number, 64);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM