我是C语言的新手。
我需要一个小程序将int
转换为二进制文件,二进制文件最好存储在一个数组中,这样我就可以进一步将它们分开以便进行解码。
我有以下内容:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[20];
int dec = 40;
int i = 0, ArrLen;
if(dec > 0)
{
while(dec > 0)
{
arr[i] = dec % 2;
i++;
dec = dec / 2;
}
}
else
{
printf("Invalid Number");
}
}
从上面的代码中,我可以在arr
中存储二进制值。
但是,不是获得等效的二进制文件:101000
,现在数组就像{0, 0, 0, 1, 0, 1}
,这是正确答案的颠倒。
所以问题是,如何以正确的顺序获取数组或者可能将其翻转?
我有一件事是肯定的,那就是最大数组长度不会超过8
元素。
此转换将重复使用。 所以我打算把它放在一个函数中,这样我就可以调用函数,传入一个整数,然后将数组作为返回值。所以另一个问题是,将数组作为返回值是否可行?
答案 0 :(得分:4)
您可以使用指向int的指针来参数化数组。参数化位数也可能很有用。
void int_to_bin_digit(unsigned int in, int count, int* out)
{
/* assert: count <= sizeof(int)*CHAR_BIT */
unsigned int mask = 1U << (count-1);
int i;
for (i = 0; i < count; i++) {
out[i] = (in & mask) ? 1 : 0;
in <<= 1;
}
}
int main(int argc, char* argv[])
{
int digit[8];
int_to_bin_digit(40, 8, digit);
return 0;
}
答案 1 :(得分:1)
或递归V2.0:
'/etc/etc'
注意,感谢@chux,这里有一个更好的递归函数来处理转换0的情况 - 它输出“0”而不是“”:
#include <stdio.h>
char *binaryToAbits(unsigned int answer, char *result) {
if(answer==0) return result;
else {
result=binaryToAbits(answer>>1,result);
*result='0'+(answer & 0x01);
return result+1;
}
}
int main(void) {
unsigned int numToConvert=0x1234ABCD;
char ascResult[64];
*binaryToAbits(numToConvert,ascResult)='\0';
printf("%s",ascResult);
return 0;
}
答案 2 :(得分:1)
与约翰尼·凯奇(Johnny Cage)相同,只是增加了一个获得数字长度的函数
#include <math.h>
int bit_len(unsigned int n){
return floor(log(n)/log(2))+1;
}
void int_to_bin_digit(unsigned int in, int len_digitis,int* out_digit){
unsigned int mask = 1U << (len_digitis-1);
int i;
for (i = 0; i < len_digitis; i++) {
out_digit[i] = (in & mask) ? 1 : 0;
in <<= 1;
}
}
int main(int argc, char* argv[]){
int number = 30;
int len = bit_len(number);
int digits[len];
int_to_bin_digit(number,len, digits);
for( int i =0;i<len;i++){
printf("%d",digits[i]);
}
return 0;
}
答案 3 :(得分:0)
尝试这样的事情:
uint8_t * intToBin(int x) {
uint8_t *bin = (int *) malloc(8);
uint8_t i = 0;
int mask = 0x80;
for (i = 0; i < 8; i++) {
bin[i] = (x & mask) >> (7-i);
mask >>= 1;
}
return bin;
}
包括<stdint.h>
以声明uint8_t
。
如果您不想要内存泄漏,请记住free
malloc
- 内存。
答案 4 :(得分:0)
使用按位逻辑:
for(int i = 0 ; i < 8 ; i++)
{
bytearray[i] = inputint & pow(2,7-i);
}
答案 5 :(得分:0)
这可能会有所帮助:
void binary(unsigned n)
{
unsigned i;
for (i = 1 << 31; i > 0; i = i / 2)
(n & i)?`/*STORE 1*/` : `/*STORE 0*/` ;
}
答案 6 :(得分:0)
这应该有用。
#include <stdio.h>
void intToBin(int dec, int bin[], int numBits){
for(int i = 0; i < numBits; i++){
bin[i] = 1 & (dec >> i);
}
}
void printArr(int arr[], int arrSize){
for(int i = 0; i < arrSize; i++) {
printf("%d ", arr[i]);
}
}
int main(int argc, char* argv[]){
int bin[32];
intToBin(-15, bin, 32);
printArr(bin, 32);
}
答案 7 :(得分:-1)
递归实施:
(因为你不能以给定数字的二进制格式预先知道位数(0/1))
int arr[200]; //for storing the binary representation of num
int i=0; // to keep the count of the no of digits in the binary representation
void calBinary(int n) // function to recalculate
{
if(n>1)
calBinary(n/2);
arr[i++]=n%2;
}