2011-01-05 113 views
0
#include <stdio.h> 
int main() 
{ 
    int num, i = 0,pos; 
    printf(" Enter num \n"); 
    scanf("%d",&num); 
    for(i = 0; i < 31; i++) 
    { 
     pos = 1 << i; 

     if (num & pos) 
      printf("1"); 
     else 
      printf("0"); 

    } 
    printf("\n"); 
    return 0; 
} 

/* 
O/P 
Enter Num 
12 
0011000000000000 

*/ 

但我想打印的O/P为0000000000001100 那么,什么变化,我必须作出获得所需的O/P我越来越大端格式输出

+0

以任何机会你只是乱搞这个问题:http://stackoverflow.com/questions/4597940/how-to-insert-zeros-between-bits-in-a-bitmap - 这就是为什么我有一个替代'for'循环只是躺在... – 2011-01-05 05:44:13

回答

-1

更改for loop更像:

#define BIT(x) (1U << (x)) 

for (i = 31; i >= 0; --i) 
{ 
    if (x & BIT(i)) { 
     putchar('1'); 
    } 
    else { 
     putchar('0'); 
    } 

} 
+0

@YeenFei:我不认为这个问题是在谈论字节顺序排列顺序 - 只是位顺序他在“int”中打印输出位。 – 2011-01-05 06:20:03

+0

是的。我现在意识到了。 – YeenFei 2011-01-05 06:28:20

1

您正在打印最不重要的位。改变你的for循环倒计时:

 for (int i = 31; i >= 0; i--) 
0

编辑: 看来,我是一个谁忽视期望输出的一个。所以其他人提供的解决方案将适用于OP。


我很惊讶人们忽视的是字节序通常适用于字节级,而不是位,使普通指数型环不能提供所需的输出的事实。

一个小数big-endian字节,你需要:

while (num) 
{ 
    big <<= 8; 
    big |= num & 0xFF; 
    num >>= 8; 
} 

所以为了输出小端整数到大端二进制文件,你需要:

// 'num' was 4-byte (int) data in little-endian format 
while (num) 
{ 
    // select required byte block 
    unsigned char curByte = num & 0xFF; 

    // prints the byte binaries 
    for(int iBit=7; iBit>=0; --iBit) 
    { 
     unsigned char theBit = curByte >> iBit; 
     if (theBit & 0x1) 
      putchar('1'); 
     else 
      putchar('0'); 

    } 

    // shifts to next byte block 
    num >>= 8; 
} 
+1

我很确定OP只是想要打印出来的int的二进制表示,最左边的是最重要的位,左边是最不重要的位。看他的问题结尾处的例子。 – 2011-01-05 06:18:17