将十进制的二进制存储在 char 数组中
store binary of decimal in char array
我想通过应用以下代码在 char
数组中存储十进制数的二进制等价物,但问题是我无法保存十进制数的最后一位。我收到垃圾值。
int k,j;
char c[40];
j=32;
scanf("%d",&k);
while(k)
{
k=k>>1;
c[j]=k|1;
j--;
}
puts("number is");
puts(c);
我假设您想要二进制的字典顺序表示。
你需要处理一些事情。
您必须初始化k
才能使用。要求用户输入(或 "hardcode",如 我们 所说)k
.
的值
如果要将数组 c
用作 string,则需要对其进行 null 终止。
需要执行&
,取值为1
,取出最后一位。用 '0'
添加它(记住, 词典)。存储那个。
当前的数组索引会给您带来麻烦。您可以使用 j
的普通数组索引,从 0
开始。循环结束后,需要对最后一个索引进行空终止,然后进行打印。
伪代码看起来像
#include <stdio.h>
int main(void) {
int val = 16;
char bin [128] = {0};
int index = 0;
while(val)
{
bin[index] = '0' + (val&1u);
val = val >> 1;
index++;
}
bin[index] = 0;
puts(bin);
return 0;
}
注意:您可能想要在打印之前反转字符串。
除了@SouravGhosh 指出的问题,您还需要
(5) 通过添加字符 '0'
的值,将数字 0/1 转换为 '0'
和 '1'
的字符值 [实际上 Sourav 也注意到了这一点],以及
(6) 在 将k
右移1 位之前 取出低位。
这是一个工作版本:
char c[40];
int j=39;
c[j--]='[=10=]';
while(k)
{
c[j]=(k&1)+'0';
j--;
k=k>>1;
}
puts("number is ");
puts(&c[j+1]);
如果有兴趣,这里有一个稍微不同的方法...
考虑一下,对于 32 位整数的图形二进制表示,您需要包含 33 个字节:32 个用于 1 和 0,1 个用于字符串 NULL 终止符。当您遍历整数值的任何 32 位表示时,您可以将 2^32 (2147483648) 的相应位与输入整数值的每个位位置进行逻辑和 (&
) 以确定该位置是否应该一个“1”或一个“0”,堆叠结果字符(ASCII)表示1
或0
(48 or 49) 随你去,变成一个字符串。
这是将整数转换为 32 位二进制表示的示例...
const char *byte_to_binary32(long x)
{
static char b[33]; // bits plus '[=10=]'
b[0] = '[=10=]';
char *p = b;
//unsigned long long z; required only if 64 bit conversion
unsigned long z;//this is sufficient for 32 bit conversion
for (z = 2147483648; z > 0; z >>= 1) //2^32
{
*p++ = (x & z) ? '1' : '0';
}
return b;
}
int main(void)
{
printf("Binary: %s\n\n", byte_to_binary32(100));
return 0;
}
我想通过应用以下代码在 char
数组中存储十进制数的二进制等价物,但问题是我无法保存十进制数的最后一位。我收到垃圾值。
int k,j;
char c[40];
j=32;
scanf("%d",&k);
while(k)
{
k=k>>1;
c[j]=k|1;
j--;
}
puts("number is");
puts(c);
我假设您想要二进制的字典顺序表示。
你需要处理一些事情。
您必须初始化
k
才能使用。要求用户输入(或 "hardcode",如 我们 所说)k
. 的值
如果要将数组
c
用作 string,则需要对其进行 null 终止。需要执行
&
,取值为1
,取出最后一位。用'0'
添加它(记住, 词典)。存储那个。当前的数组索引会给您带来麻烦。您可以使用
j
的普通数组索引,从0
开始。循环结束后,需要对最后一个索引进行空终止,然后进行打印。
伪代码看起来像
#include <stdio.h>
int main(void) {
int val = 16;
char bin [128] = {0};
int index = 0;
while(val)
{
bin[index] = '0' + (val&1u);
val = val >> 1;
index++;
}
bin[index] = 0;
puts(bin);
return 0;
}
注意:您可能想要在打印之前反转字符串。
除了@SouravGhosh 指出的问题,您还需要
(5) 通过添加字符 '0'
的值,将数字 0/1 转换为 '0'
和 '1'
的字符值 [实际上 Sourav 也注意到了这一点],以及
(6) 在 将k
右移1 位之前 取出低位。
这是一个工作版本:
char c[40];
int j=39;
c[j--]='[=10=]';
while(k)
{
c[j]=(k&1)+'0';
j--;
k=k>>1;
}
puts("number is ");
puts(&c[j+1]);
如果有兴趣,这里有一个稍微不同的方法...
考虑一下,对于 32 位整数的图形二进制表示,您需要包含 33 个字节:32 个用于 1 和 0,1 个用于字符串 NULL 终止符。当您遍历整数值的任何 32 位表示时,您可以将 2^32 (2147483648) 的相应位与输入整数值的每个位位置进行逻辑和 (&
) 以确定该位置是否应该一个“1”或一个“0”,堆叠结果字符(ASCII)表示1
或0
(48 or 49) 随你去,变成一个字符串。
这是将整数转换为 32 位二进制表示的示例...
const char *byte_to_binary32(long x)
{
static char b[33]; // bits plus '[=10=]'
b[0] = '[=10=]';
char *p = b;
//unsigned long long z; required only if 64 bit conversion
unsigned long z;//this is sufficient for 32 bit conversion
for (z = 2147483648; z > 0; z >>= 1) //2^32
{
*p++ = (x & z) ? '1' : '0';
}
return b;
}
int main(void)
{
printf("Binary: %s\n\n", byte_to_binary32(100));
return 0;
}