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

h9vpoimq  于 2023-03-25  发布在  其他
关注(0)|答案(7)|浏览(279)

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

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

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

i2loujxw

i2loujxw1#

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

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

或者更“数学”的方式(仅当num2仅为数字时有效)

int num3 = num1 * 10 + num2;
  • 请注意,第一个解决方案适用于任何数字,这也意味着如果不存储数字的长度,就无法恢复原始数字 *。
w6mmgewl

w6mmgewl2#

我想你是想把两个字符串连接起来。
Convert the int to string然后concatenate the two strings这将从字符串“2”和“6”中给予串联字符串“26”如果你需要int 26,那么你可以在串联后将convert it back转换为int。祝你好运:-)

wecizke3

wecizke33#

那么,如果只是将相乘的数字相加并推到它们想要的位置呢?

int num3 = num1 * 10 + num2;
nwwlzxa7

nwwlzxa74#

您可以使用按位操作将多个整数存储为一个整数。
对于您提供的示例:

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进行右移以获得num 1,并与2的位数幂-1(2 ^ n - 1, where n = number of bits)进行位与运算。
对于4位,num 3 = 38;

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

对于3位,num 3 = 22:

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

希望这个有用。

m2xkgtsf

m2xkgtsf5#

有点晚,但是:
你可以用这两个整数组成一个字符串,然后把它转换回字符串。
下面是我的更简单但更大的代码:

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;

也许没有其他例子那么有效,但如果有两位数,它也可以工作。

plupiseo

plupiseo6#

这似乎是一个老问题,我也想拥有这种能力。
因为还没有人提到这一点,如果你有一个阈值,可以验证数字是否低于范围上限,你可以做的是通过单独存储它们的位来将两个数字存储在一个数字类型中。
您可以存储第一个数字,将位设置为little endian,对于第二个数字,您可以将位存储为big endian。
然后你可以将其抽象为只使用字节作为大小,字节的长度取决于你的arch,通常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的答案,但很少有答案指出你需要一个上限阈值为您的价值观,否则它只是一个加载的脚枪。

wfveoks0

wfveoks07#

你必须将它们存储为字符串,以便像这样连接它们:

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应该是最好的,因为它可以容纳任意大数量的int

相关问题