是否可以将多个整数分配为一个?

时间:2019-01-31 12:28:15

标签: c++

假设我有

int a = 3; 
int b = 4; 
int c = 6;

如何执行类似的操作:

int d = a,b,c;

并获得d = 346;

我只需要按正确的顺序将值存储在另一个整数中即可。

我已经尝试过:d = a,b,c

但是它显示:

Error: 'int b': redefinition and 'int c' : redefinition     

4 个答案:

答案 0 :(得分:3)

有很多方法,但不是您尝试过的。您可以将每个值分配到新int中自己的字节中:

min_

或者使用半字节而不是字节:

max_

如果要合并单个十进制数字,可以执行以下操作:

int d = a << 16 | b << 8 | c;
std::cout << std::hex << std::setw(6) << d << std::endl; // prints 030406

最后,您需要更精确地指定如何您希望将这些值组合在一起(从而也可以再次分离它们...)。

您还需要指定如何处理不适合目标的值(例如int d = a << 8| b << 4 | c; std::cout << std::hex << d << std::endl; // prints 346 ),以及是否仅将这些值声明为非法;换句话说:您将为a,b和c指定有效范围。顺便说一句:如果这些范围是非负的,请考虑改为使用int d = a * 100 + b * 10 + c; std::cout << d << std::endl; // prints 346

根据评论进行编辑

当您尝试组合日期值(日,月,年)时:将它们组合到一个结构中要容易得多:

a = b = c = 1 << 16;

提供了32位的unsigned int,该结构也不会更小-而且16位的struct Date { uint16_t year; // maybe int16_t instead, if you want to represent years BC, too uint8_t month; uint8_t day; }; 也将无法保存完整的日期(除非您删除了一些信息)...

答案 1 :(得分:1)

对数字执行该操作很奇怪,我看不出这样做的原因。如果确实需要,则应该改用字符串:

int a = 3;
int b = 4;
int c = 6;
std::string result = std::to_string(a) + std::to_string(b) + std::to_string(c);

std::cout << result << "\n";

如果需要返回数值,则可以使用std::stoi()或等效值。如果数字不适合整数类型,则会引发异常:

int d = std::stoi(result);

答案 2 :(得分:0)

您缺少的概念:

对于左值(在您的情况下,赋值初始化的左侧)声明,您可以在一行上创建多个int变量:

int a, b, c, d;

但是,对于初始化,只有一个右值可以对应一个int变量:

int a = 1, b, c = 5, d;

回答您的实际问题:

我真的很喜欢阿空加瓜的解决方案: (但是,在某些机器上,尤其是旧机器上,int保证为16位而不是32位,因此我通过以下方式对其进行了修改,以使其更易于移植)

long d = a | b << 8 | c << 16;

在这种情况下,考虑到您的long至少具有32位表示形式,因此在管道传输时,a使用第一个字节(8位)表示,b使用第二个字节表示,c使用第三个字节表示。这就像添加字节表示形式以为新的long创建新的字节表示形式。

答案 3 :(得分:0)

您可以使用std::stringstream

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    int a = 3; 
    int b = 4; 
    int c = 6;

    int d;

    std::stringstream str;
    str<<a<<b<<c;
    str>>d;

    std::cout<<"d="<<d<<std::endl;
}

结果:

  

d = 346