如何将 int 数组转换为单个 int c
Posted
技术标签:
【中文标题】如何将 int 数组转换为单个 int c【英文标题】:How to convert an int array into a single int c 【发布时间】:2021-11-25 07:27:54 【问题描述】:我有一个整数数组 int KEY[32],它存储四字母四边形的二进制表示,例如:
char quadgram[4] = 'T','I','O','N';
其中字符的二进制表示为:T => 01010100, I => 01001001, O => 01001111, N => 01001110。我已将这些二进制数转换为整数数组:
KEY[32] = 01010100010010010100111101001110;
现在我需要将这个 KEY 转换成它的字面二进制值,即:
int KEY_BIN = 1414090574; // in decimal.
我将如何完成将 KEY 转换为 KEY_BIN?
【问题讨论】:
您需要使用位移运算符(<<
或>>
)和二元或运算符|
。
【参考方案1】:
给定整数数组,您可以遍历它们,将数字移位适当的位数,然后将其与结果值按位或。您会希望 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
【讨论】:
太棒了!这完美无缺。我只是将auto更改为int。我有很多要学习的;这种位移使我感到困惑。谢谢!! 中间步骤KEY
数组完全是多余的,让代码效率低下。
(是的,在按位算术中使用 C++11 auto
会让你大吃一惊。不要在硬件相关编程中使用 C++(11)。)【参考方案2】:
我已将这些二进制数转换成整数数组
为什么?这对计算机来说不是一种有用的格式,它只是一个多余的中间步骤。摆脱它,不需要它。
如何将值存储在整数中取决于字节序,What 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);
【讨论】:
所以在您的示例中 val 将等于 1414090574?所以我认为我所做的一开始就是愚蠢的。我正在编写一个密码分析例程来解密替换密码,方法是实现一个“爬山”算法,该算法使用英语四边形概率的统计分析来确定我破解密钥的各种尝试的适用性(如果有任何意义的话)。重点是,我有一个超过 200 万个四边形及其相关概率的列表(每个四边形在《战争与碎片》一书中使用的频率……这只是一个任意文本)。 ... 我需要将所有这 200 万个四边形存储在某种查找表中。我正在使用哈希表。我使用每个四边形的四个字符作为密钥,以便在加密文本中找到匹配的四边形时可以查找它们。我的问题是,当我只将四边形的 ascii 值的总和作为键时,有数百个重复键,例如 TION 和 NOIT 和 ONIT 都将具有相同的值。所以我想,这些四边形的二进制表示都是唯一的,这将使我的哈希函数非常简单。所以,是的,我很困惑。也谢谢!以上是关于如何将 int 数组转换为单个 int c的主要内容,如果未能解决你的问题,请参考以下文章