我正在尝试将整数10转换为二进制数1010.
这段代码尝试了,但我在strcat()上得到了一个段错误:
int int_to_bin(int k)
{
char *bin;
bin = (char *)malloc(sizeof(char));
while(k>0) {
strcat(bin, k%2);
k = k/2;
bin = (char *)realloc(bin, sizeof(char) * (sizeof(bin)+1));
}
bin[sizeof(bin)-1] = '\0';
return atoi(bin);
}
如何在C中将整数转换为二进制?
答案 0 :(得分:13)
如果要将数字转换为另一个数字(不是数字到字符串),并且可以使用小范围(0到1023用于32位整数的实现),则无需添加char*
解决方案
unsigned int_to_int(unsigned k) {
if (k == 0) return 0;
if (k == 1) return 1; /* optional */
return (k % 2) + 10 * int_to_int(k / 2);
}
HalosGhost建议将代码压缩成一行
unsigned int int_to_int(unsigned int k) {
return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k / 2)));
}
答案 1 :(得分:6)
您需要初始化bin,例如
bin = malloc(1);
bin[0] = '\0';
或使用calloc:
bin = calloc(1, 1);
你也有一个错误:
bin = (char *)realloc(bin, sizeof(char) * (sizeof(bin)+1));
这需要:
bin = (char *)realloc(bin, sizeof(char) * (strlen(bin)+1));
(即使用strlen
,而不是sizeof
)。
你应该在调用strcat之前增加的大小。
你没有释放bin,所以你有内存泄漏。
您需要将0,1转换为'0','1'。
你不能将字符串strcat到字符串。
除此之外,它很接近,但代码应该更像这样(警告,未经测试!):
int int_to_bin(int k)
{
char *bin;
int tmp;
bin = calloc(1, 1);
while (k > 0)
{
bin = realloc(bin, strlen(bin) + 2);
bin[strlen(bin) - 1] = (k % 2) + '0';
bin[strlen(bin)] = '\0';
k = k / 2;
}
tmp = atoi(bin);
free(bin);
return tmp;
}
答案 2 :(得分:5)
只需使用itoa转换为字符串,然后使用atoi转换回小数。
unsigned int_to_int(unsigned int k) {
char buffer[65]; /* any number higher than sizeof(unsigned int)*bits_per_byte(8) */
return atoi( itoa(k, buffer, 2) );
}
答案 3 :(得分:3)
整数到二进制转换的工作解决方案如下。
int main()
{
int num=241; //Assuming 16 bit integer
for(int i=15; i>=0; i--) cout<<((num >> i) & 1);
cout<<endl;
for(int i=0; i<16; i++) cout<<((num >> i) & 1);
cout<<endl;
return 0;
}
你可以捕捉cout&lt;&lt;部分基于您自己的要求。
答案 4 :(得分:2)
您可以使用函数this函数返回char*
,其中包含整数的字符串表示形式:
char* itob(int i) {
static char bits[8] = {'0','0','0','0','0','0','0','0'};
int bits_index = 7;
while ( i > 0 ) {
bits[bits_index--] = (i & 1) + '0';
i = ( i >> 1);
}
return bits;
}
这不是一个完美的实现,但如果你用一个简单的printf("%s", itob(170))
测试,你会得到01010101,因为我记得170。添加atoi(itob(170))
,你将得到整数,但绝对不是整数值的170。
答案 5 :(得分:2)
好吧,我遇到了同样的麻烦......所以我找到了这个帖子
我认为用户的答案:&#34; pmg&#34; 不会一直有效。
unsigned int int_to_int(unsigned int k) {
return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k / 2)));
}
原因:二进制表示存储为整数。这是非常有限的。 想象一下将十进制转换为二进制:
dec 255 -> hex 0xFF -> bin 0b1111_1111
dec 1023 -> hex 0x3FF -> bin 0b11_1111_1111
并且您必须存储此二进制表示,因为它是十进制数。
我认为来自 Andy Finkenstadt 的解决方案最接近您的需求
unsigned int_to_int(unsigned int k) {
char buffer[65]; // any number higher than sizeof(unsigned int)*bits_per_byte(8)
return itoa( atoi(k, buffer, 2) );
}
但这仍然不适用于大数字。 不要太惊讶,因为你可能真的不需要将字符串转换回十进制。它没有多大意义。如果您需要二进制数,通常需要在某处使用 文本 ,请将其保留为 字符串格式 。
只需使用 itoa()
即可char buffer[65];
itoa(k, buffer, 2);
答案 6 :(得分:0)
您可以使用此函数从整数中获取位数。
int* num_to_bit(int a, int *len){
int arrayLen=0,i=1;
while (i<a){
arrayLen++;
i*=2;
}
*len=arrayLen;
int *bits;
bits=(int*)malloc(arrayLen*sizeof(int));
arrayLen--;
while(a>0){
bits[arrayLen--]=a&1;
a>>=1;
}
return bits;
}
答案 7 :(得分:0)
head(df)[1]
答案 8 :(得分:0)
您可以按照以下示例将十进制转换为bin,将十六进制转换为十进制,将hexa转换为bin,反之亦然,等等。 将十进制转换为BIN
int convert_to_bin(int number){
int binary = 0, counter = 0;
while(number > 0){
int remainder = number % 2;
number /= 2;
binary += pow(10, counter) * remainder;
counter++;
}
}
然后您可以打印类似的二进制文件:
printf("08%d", convert_to_bin(13)); //shows leading zeros
答案 9 :(得分:0)
以下函数将字符串中的整数转换为二进制(n是位数):
// Convert an integer to binary (in a string)
void int2bin(unsigned integer, char* binary, int n=8)
{
for (int i=0;i<n;i++)
binary[i] = (integer & (int)1<<(n-i-1)) ? '1' : '0';
binary[n]='\0';
}
在repl.it上在线测试。
来源:AnsWiki。
以下函数将字符串中的整数转换为二进制并为字符串分配内存(n是位数):
// Convert an integer to binary (in a string)
char* int2bin(unsigned integer, int n=8)
{
char* binary = (char*)malloc(n+1);
for (int i=0;i<n;i++)
binary[i] = (integer & (int)1<<(n-i-1)) ? '1' : '0';
binary[n]='\0';
return binary;
}
该选项允许您编写类似printf ("%s", int2bin(78));
的内容,但请注意,为该字符串分配的内存以后必须释放。
在repl.it上在线测试。
来源:AnsWiki。
下面的函数将一个整数转换为另一个整数(最多8位):
// Convert an integer to binary (in an unsigned)
unsigned int int_to_int(unsigned int k) {
return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k / 2)));
}
在repl.it上在线测试
以下功能显示二进制转换
// Convert an integer to binary and display the result
void int2bin(unsigned integer, int n=8)
{
for (int i=0;i<n;i++)
putchar ( (integer & (int)1<<(n-i-1)) ? '1' : '0' );
}
在repl.it上在线测试。
来源:AnsWiki。
答案 10 :(得分:0)
您可以将函数添加到标准库中,并在需要时随时使用。
这是C++中的代码
#include <stdio.h>
int power(int x, int y) //calculates x^y.
{
int product = 1;
for (int i = 0; i < y; i++)
{
product = product * x;
}
return (product);
}
int gpow_bin(int a) //highest power of 2 less/equal to than number itself.
{
int i, z, t;
for (i = 0;; i++)
{
t = power(2, i);
z = a / t;
if (z == 0)
{
break;
}
}
return (i - 1);
}
void bin_write(int x)
{
//printf("%d", 1);
int current_power = gpow_bin(x);
int left = x - power(2, current_power);
int lower_power = gpow_bin(left);
for (int i = 1; i < current_power - lower_power; i++)
{
printf("0");
}
if (left != 0)
{
printf("%d", 1);
bin_write(left);
}
}
void main()
{
//printf("%d", gpow_bin(67));
int user_input;
printf("Give the input:: ");
scanf("%d", &user_input);
printf("%d", 1);
bin_write(user_input);
}
答案 11 :(得分:0)
#define BIT_WIDTH 32
char *IntToBin(unsigned n, char *buffer) {
char *ptr = buffer + BIT_WIDTH;
do {
*(--ptr) = (n & 1) + '0';
n >>= 1;
} while(n);
return ptr;
}
#define TEST 1
#if TEST
#include <stdio.h>
int main() {
int n;
char buff[BIT_WIDTH + 1];
buff[BIT_WIDTH] = '\0';
while(scanf("%d", &n) == 1)
puts(IntToBin(n, buff));
return 0;
}
#endif
答案 12 :(得分:-4)
short a;
short b;
short c;
short d;
short e;
short f;
short g;
short h;
int i;
char j[256];
printf("BINARY CONVERTER\n\n\n");
//uses <stdlib.h>
while(1)
{
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=0;
h=0;
i=0;
gets(j);
i=atoi(j);
if(i>255){
printf("int i must not pass the value 255.\n");
i=0;
}
if(i>=128){
a=1;
i=i-128;}
if(i>=64){
b=1;
i=i-64;}
if(i>=32){
c=1;
i=i-32;}
if(i>=16){
d=1;
i=i-16;}
if(i>=8){
e=1;
i=i-8;}
if(i>=4){
f=1;
i=i-4;}
if(i>=2){
g=1;
i=i-2;}
if(i>=1){
h=1;
i=i-1;}
printf("\n%d%d%d%d%d%d%d%d\n\n",a,b,c,d,e,f,g,h);
}