[英]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.謝謝!
unsigned long
, 1 << …
還是一個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)
不正確。
sizeof(n)*4
是32,而不是64。您可能想要sizeof(n)*8
1<<63
可能會給您帶來溢出,因為默認情況下1可能是32位。 您應該使用1ULL<<(sizeof(n)*8-1)
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.