C++ 在一个 int 变量中存储多个整数

问题描述 投票:0回答:7

我正在尝试将多个整数存储在一个 int 变量中。 所以像这样:

int num1 = 2;
int num2 = 6;
int num3 = num1 + num2;

但我得到 8。我想要 26。我知道这是我应该期望的结果,但我只是想要一种将整数捆绑在一起而不是将它们相加的方法,我想不出更好的例子。

谢谢!

c++ int
7个回答
6
投票

您可以将它们转换为字符串,添加它们,然后将它们转换回来(作为第二个选项效率不高)

int num3 = std::stoi(std::to_string(num1) + std::to_string(num2));

或更“数学”的方式(仅当

num2
只是一个数字时才有效)

int num3 = num1 * 10 + num2;

请注意,第一个解决方案适用于任何数字,这也意味着如果不存储数字的长度,就无法取回原始数字


0
投票

我想你想连接两个字符串文字。
将整数转换为字符串然后连接两个字符串 这将为您提供字符串“2”和“6”的连接字符串“26” 如果您需要 int 26,那么您可以在连接后将其转换回 为 int。 祝你好运:-)


0
投票

好吧,将相乘的数字相加并推到它们的预期位置怎么样?

int num3 = num1 * 10 + num2;

0
投票

您可以使用按位运算将多个整数存储为一个整数。

对于您提供的示例:

int num1 = 2; // 0010
int num2 = 6; // 0110

然后您可以使用 4 位连接数字:

int num3 = (2 << 4) | 6; // 00100110 num3 = 38

或者如果你使用 3 位,那么它变成:

int num3 = (2 << 3) | 6; //010110 num3 = 22

要取回数字,您必须在

num3
上进行右移以获得 num1 并使用 2 的位数进行按位 AND - 1 (
2 ^ n - 1, where n = number of bits
)。

对于 4 位,num3 = 38;

num1 = num3 >> 4; // 2
num2 = num3 & (2 * 2 * 2 * 2 - 1); // 6

对于 3 位,num3 = 22:

num1 = num3 >> 3; // 2
num2 = num3 & (2 * 2 * 2 * 2 - 1); // 6

希望这有帮助。


0
投票

有点晚,但是:

您可以将这两个整数组成一个字符串,然后将其转换回一个字符串。

这是我更简单但更大的代码:

int foo = 2;
int bar = 6;
string temp = to_string(foo) + to_string(bar);
int foobar = stoi(temp);
cout << foobar;

这是我的小号:

int foo = 6;
int bar = 2;
int foobar = stoi(string(to_string(foo)) + string(to_string(bar)));
cout << foobar;

可能不如其他示例有效,但如果有两位数,它也可以工作。


0
投票

这似乎是一个老问题,我偶然发现我也想拥有这种能力。

因为还没有人提到这一点,如果您有阈值可以验证该数字是否低于该范围上限,您可以做的是通过分别存储它们的位来将两个数字存储在一个数字类型中。

您将存储第一个数字设置位,就像在小端中一样,对于第二个数字,您将在大端中存储位。

然后您可以将其抽象为仅使用字节作为大小和字节长度,具体取决于您的架构,通常 1 个字节是 8 位,这意味着使用 uint16(2 个字节)我们可以将每个数字限制为空间的一半因为每个存储的数字都需要是一个 uint8.

如果我们存储在 uint8 中,那么两个数字都应该在 4 位以内表示。

这对小数字很有用,因为明显的限制..

// Examples
// uint8 - store first number - little endian
[0][0][0][0] [1][1][1][1] = 15 // storing in 4 bits the max value
// uint8 adding value of 3 as second value in big endian
[1][1][0][0] [1][1][1][1]
// uint16 store first number - little endian
[0][0][0][0][0][0][0][0] [1][1][1][1][1][1][1][1] = 255 // storing in 8 bits the max value

因此,如果以 4 位存储,则最大值为 15;如果以 8 位存储,则最大值为 255,存储在该值之上的任何内容都会溢出并破坏其他存储值。


显然,当您不需要进一步分区时,将它们视为小端和大端仅适用于两个数字,因为这有助于考虑它们的存储方式。并且可能有一些库会在字节序表示之间自动提供帮助。

但是您可以将字节划分为您想要的多少位片,只是如果不使用字节顺序,您可能需要手动进行更多转换。

分区也在 intotito 的答案中,但很少有答案指出您的值需要一个上限阈值,否则它只是一个上膛的脚枪。


-1
投票

您必须将它们存储为字符串才能像这样连接它们:

string str_num1 = to_string(num1);
string str_num2 = to_string(num2);
string result = num1 + num2;

这是一种糟糕的方法,因为如果您使用任何不是 1 位数的数字,存储和/或提取数据会变得太复杂。

使用向量或对。更容易,更少麻烦:

pair<int, int> presult = make_pair(num1, num2);  ///or
vector<int> vresult;
vresult.push_back(num1);
vresult.push_back(num2);  ///num1 in spot 0, num2 in spot 1

vector 应该是最好的,因为它可以容纳任意数量的整数

© www.soinside.com 2019 - 2024. All rights reserved.