我正在尝试在C中编写一个打印int的程序。 由于某种原因,我得到错误的价值观,
void printBits(unsigned int num){
unsigned int size = sizeof(unsigned int);
unsigned int maxPow = 1<<(size*8-1);
printf("MAX POW : %u\n",maxPow);
int i=0,j;
for(;i<size;++i){
for(j=0;j<8;++j){
// print last bit and shift left.
printf("%u ",num&maxPow);
num = num<<1;
}
}
}
我的问题,第一次为什么我会得到这个结果(对于printBits(3))。
MAX POW:2147483648 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2147483648 214748364 8
第二有更好的方法吗?
答案 0 :(得分:16)
您正在正确计算结果,但您没有正确打印。你也不需要第二个循环:
for(;i<size*8;++i){
// print last bit and shift left.
printf("%u ",num&maxPow ? 1 : 0);
num = num<<1;
}
如果您想炫耀,可以用两个感叹号替换条件:
printf("%u ", !!(num&maxPow));
答案 1 :(得分:8)
您得到的结果是因为num&maxPow
为0或maxPow
。要打印1而不是maxPow
,您可以使用printf("%u ", num&maxPow ? 1 : 0);
。打印位的另一种方法是
while(maxPow){
printf("%u ", num&maxPow ? 1 : 0);
maxPow >>= 1;
}
即。将位掩码向右移动而不是向左移动num
。当掩码的设置位移出时,循环结束。
答案 2 :(得分:5)
为了解决第二点,我会考虑以下内容,为了便于理解,我们会对其进行简化。
void printBits(unsigned int num)
{
for(int bit=0;bit<(sizeof(unsigned int) * 8); bit++)
{
printf("%i ", num & 0x01);
num = num >> 1;
}
}
答案 3 :(得分:2)
void print_bits(unsigned int x)
{
int i;
for(i=8*sizeof(x)-1; i>=0; i--) {
(x & (1 << i)) ? putchar('1') : putchar('0');
}
printf("\n");
}
答案 4 :(得分:0)
该宏怎么样:
#define print_bits(x) \
do { \
unsigned long long a__ = (x); \
size_t bits__ = sizeof(x) * 8; \
printf(#x ": "); \
while(bits__--) putchar(a__ & (1 << bits__) ? '1' : '0'); \
putchar('\n'); \
} while(0)
使用方式:
char c = 3;
int i = -1;
print_bits(c);
print_bits(i);
输出:
c: 00000011
i: 11111111111111111111111111111111
如果您不想打印表达式'x',这是'print_bits'的参数,请删除该行:
printf(#x ": "); \
此Marco可以用于任何原始数据类型,并且表达式'x'仅被评估一次。因此,您应该避免出现副作用。
答案 5 :(得分:0)
我想你可以删除一些代码和
void printB(unsigned int num){
unsigned int size = sizeof(unsigned int);
int i;
for(i = size*8-1; i>= 0; i--){
printf("%u",(num >>i) & 1 );
}
printf("\n");
}