C - 将整数转换为二进制数组
C - Convert Integer to Binary Array
我对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}
,这是正确答案的 reversed。
所以问题是,如何以正确的顺序获取数组或可能翻转它?
我可以肯定一件事,那就是最大数组长度不会超过 8
个元素。
此转换将重复使用。
所以我打算把它放在一个函数中,这样我就可以调用该函数,传入一个整数,然后将数组作为 return 值。那么另一个问题是,获取数组作为return值是否可行?
尝试这样的事情:
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;
}
在 uint8_t
的声明中包含 <stdint.h>
。
如果您不想内存泄漏,请记住 free
malloc
-ed 内存。
递归实现:
(因为你无法事先知道给定数字的二进制格式的位数(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;
}
使用按位逻辑:
for(int i = 0 ; i < 8 ; i++)
{
bytearray[i] = inputint & pow(2,7-i);
}
这可能会有帮助:
void binary(unsigned n)
{
unsigned i;
for (i = 1 << 31; i > 0; i = i / 2)
(n & i)?`/*STORE 1*/` : `/*STORE 0*/` ;
}
您可以使用指向 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;
}
或递归V2.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)='[=10=]';
printf("%s",ascResult);
return 0;
}
注意,感谢@chux,这里有一个更好的递归函数来处理转换 0 的情况——它输出“0”而不是“”:
char *binaryToAbits(unsigned int answer, char *result) {
if(answer>1) {
result=binaryToAbits(answer>>1,result);
}
*result='0'+(answer & 0x01);
return result+1;
};
这应该有效。
#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);
}
与 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;
}
我对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}
,这是正确答案的 reversed。
所以问题是,如何以正确的顺序获取数组或可能翻转它?
我可以肯定一件事,那就是最大数组长度不会超过 8
个元素。
此转换将重复使用。 所以我打算把它放在一个函数中,这样我就可以调用该函数,传入一个整数,然后将数组作为 return 值。那么另一个问题是,获取数组作为return值是否可行?
尝试这样的事情:
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;
}
在 uint8_t
的声明中包含 <stdint.h>
。
如果您不想内存泄漏,请记住 free
malloc
-ed 内存。
递归实现:
(因为你无法事先知道给定数字的二进制格式的位数(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;
}
使用按位逻辑:
for(int i = 0 ; i < 8 ; i++)
{
bytearray[i] = inputint & pow(2,7-i);
}
这可能会有帮助:
void binary(unsigned n)
{
unsigned i;
for (i = 1 << 31; i > 0; i = i / 2)
(n & i)?`/*STORE 1*/` : `/*STORE 0*/` ;
}
您可以使用指向 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;
}
或递归V2.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)='[=10=]';
printf("%s",ascResult);
return 0;
}
注意,感谢@chux,这里有一个更好的递归函数来处理转换 0 的情况——它输出“0”而不是“”:
char *binaryToAbits(unsigned int answer, char *result) {
if(answer>1) {
result=binaryToAbits(answer>>1,result);
}
*result='0'+(answer & 0x01);
return result+1;
};
这应该有效。
#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);
}
与 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;
}