我试图使用下面用C编写的函数将十进制值转换为二进制值。我不知道为什么它要打印32个零,而不是二进制值2。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
int binaryConversion(int num){
int bin_buffer[32];
int mask = INT_MIN;
for(int i = 0; i < 32; i++){
if(num & mask){
bin_buffer[i] = 1;
mask >> 1;
}
else{
bin_buffer[i] = 0;
mask >> 1;
}
}
for(int j = 0; j < 32; j++){
printf("%d", bin_buffer[j]);
}
}
int main(){
binaryConversion(2);
}谢谢
发布于 2019-03-05 00:54:22
两个错误:
>>而不是>>=,因此您实际上不会更改mask。mask为unsigned,所以当您移动时,它会得到符号扩展,这是您不想要的。发布于 2019-03-05 01:12:11
您已经回答了关于使用>>而不是=>>的主要问题。但是,从基本的角度来看,不需要将1和0缓冲在int数组中(例如,int bin_buffer[32];),如果只输出数字的二进制表示,则无需使用variadic printf函数来显示int值。
相反,您所需要的只是putchar()输出'1'或'0',这取决于是否设置了任何位。还可以通过提供所需表示的大小,例如byte (8位)、word (16位)等等,使输出函数更加有用。
例如,您可以:
#include <stdio.h>
#include <limits.h>
/** binary representation of 'v' padded to 'sz' bits.
* the padding amount is limited to the number of
* bits in 'v'. valid range: 0 - sizeof v * CHAR_BIT.
*/
void binaryConversion (const unsigned long v, size_t sz)
{
if (!sz) { fprintf (stderr, "error: invalid sz.\n"); return; }
if (!v) { while (sz--) putchar ('0'); return; }
if (sz > sizeof v * CHAR_BIT)
sz = sizeof v * CHAR_BIT;
while (sz--)
putchar ((v >> sz & 1) ? '1' : '0');
}
int main(){
fputs ("byte : ", stdout);
binaryConversion (2, 8);
fputs ("\nword : ", stdout);
binaryConversion (2, 16);
putchar ('\n');
}它允许您设置想要显示的位数。
示例使用/输出
$ ./bin/binaryconversion
byte : 00000010
word : 0000000000000010您的方法没有什么问题,但是可能有一种更简单的方法来获得相同的输出。
如果你还有其他问题,请告诉我。
发布于 2019-03-05 02:06:40
INT_MIN是一个负数,所以当您使用>>转到右边时,最重要的位仍然是1而不是零,您将在mask=11111...111中结束所有位都有1的值。而且,mask值没有变化。最好用>>=代替。您可以尝试在0x1上隐藏,并改变num的实际值,而不是这样的mask。
int binaryConversion(int num) {
char bin_buffer[32 + 1]; //+1 for string terminator.
int shifted = num;
for (int i = 31; i >= 0; --i, shifted >>= 1) { //loop 32x
bin_buffer[i] = '0' + (shifted & 0x1);
}
bin_buffer[32] = 0; //terminate the string.
printf("%s", bin_buffer);
}https://stackoverflow.com/questions/54993842
复制相似问题