假设我有
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
答案 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