如何将一个int数组转换成一个int c

How to convert an int array into a single int c

我有一个整数数组 int KEY[32],它存储四字母四边形的二进制表示,例如:

char quadgram[4] = {'T','I','O','N'};

其中字符的二进制表示are:T => 01010100,I => 01001001,O => 01001111,N => 01001110。我已经将这些二进制数转换为整数数组:

KEY[32] = 01010100010010010100111101001110;

现在我需要将这个 KEY 转换成它的二进制值,即:

int KEY_BIN = 1414090574; // in decimal.

如何将 KEY 转换为 KEY_BIN?

给定整数数组,您可以遍历它们,将数字移位适当的位数,然后将其与您的结果值按位或运算。你会希望 KEY 是一个无符号整数数组,以便具有明确定义的位移行为。

一个工作示例:

#include <stdio.h>

int main() {
   unsigned int KEY[32] = {0, 1, 0, 1, 0, 1, 0, 0, 0, 
                           1, 0, 0, 1, 0, 0, 1, 0, 1, 
                           0, 0, 1, 1, 1, 1, 0, 1, 0, 
                           0, 1, 1, 1, 0 };
   unsigned int result = 0;
   for ( unsigned int i = 0; i < 32; ++i ) {
      unsigned int shiftAmount = 32 - i - 1;
      unsigned int shifted = KEY[i] << shiftAmount;
      result |= shifted;
   }

   printf( "%u\n", result ); // Prints 1414090574
}

I have converted these binary numbers into the integer array

为什么?这对计算机来说不是有用的格式,它只是一个多余的中间步骤。摆脱它,不需要它。


如何在整数中存储值取决于endianessWhat is CPU endianness? 如果我们先不理解这一点,那么就没有办法了。

现在你所说的“文字二进制值”实际上是大端表示,第一个字符存储在最重要的地址。我们可以通过使用位移位始终将第一个字母移动到 ms 字节来使字节顺序可移植代码:

#include <stdio.h>
#include <stdint.h>

int main (void)
{
  char quadgram[4] = {'T','I','O','N'};
  uint32_t val;

  val = (uint32_t)quadgram[0] << 24 |
        (uint32_t)quadgram[1] << 16 |
        (uint32_t)quadgram[2] <<  8 |
        (uint32_t)quadgram[3] <<  0 ;

  printf("%d\n", val);
}