Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接字节值的超快速方法_C++_String_Byte - Fatal编程技术网

C++ 连接字节值的超快速方法

C++ 连接字节值的超快速方法,c++,string,byte,C++,String,Byte,给定3个不同的字节,比如说x=64,y=90,z=240,我想把它们连接成一个字符串,比如说6490240。如果这能起作用,那就太好了,但事实并非如此: string xx = (string)x + (string)y + (string)z; 我在C++中工作,并将使用字节的8位表示来将字节连接为24位字符串。p> 它需要非常快,因为我在大量数据上使用了这种方法,而且令人沮丧的是,他们的方法似乎不是说把这个字节当作字符串来对待 非常感谢你的帮助 为了澄清,我之所以特别强调使用3字节,是因

给定3个不同的字节,比如说x=64,y=90,z=240,我想把它们连接成一个字符串,比如说6490240。如果这能起作用,那就太好了,但事实并非如此:

 string xx = (string)x + (string)y + (string)z;

我在C++中工作,并将使用字节的8位表示来将字节连接为24位字符串。p> 它需要非常快,因为我在大量数据上使用了这种方法,而且令人沮丧的是,他们的方法似乎不是说把这个字节当作字符串来对待

非常感谢你的帮助

为了澄清,我之所以特别强调使用3字节,是因为原始数据与RGB值有关,RGB值通过指针读取,当然作为字节存储在内存中


我想要一种独立处理每种颜色的方法,这样你可以把它看作是一个散列函数。因此,任何不发生碰撞的快速表示法都是可取的。这是我能想到的避免任何碰撞的唯一方法。

试试sprintf(xx,“%d%d”,x,y,z)

将数字转换为字符串的最简单方法是使用


根据系统的endian属性,您可能需要调整设置的长int的字节数。我的示例覆盖字节0-2,但您可能希望写入字节1-3。你可能想把顺序写成z,y,x,而不是x,y,z。这种细节取决于平台。虽然如果你不想打印RGB值,但是只想把它看作一个哈希,那么你就不必担心你写的字节或者按什么顺序。

< P>使用3个字符数组作为你的24位表示,并为每个字符分配一个输入值的值。

将3个字节转换为位并将结果存储在数组中可以很容易地完成,如下所示:

void bytes2bits(unsigned char x, unsigned char y, unsigned char z, char * res)
{
    res += 24; *res-- = 0;
    unsigned xyz = (x<<16)+(y<<8)+z;
    for (size_t l = 0 ; l < 24 ; l++){
        *res-- = '0'+(xyz & 1); xyz >>= 1;
    }

你是否考虑将颜色元素打包成三字节的整数?



uint32\u t full\u color=(x itoa()?可能是一个n00b答案。字符串操作通常很慢。为什么不将它们作为数字保留到以后呢?(在大多数平台上,您可以在长整数中存储四个字节)您可以编写
char arr[256][3]={“000”、“001”、…}
然后
arr[x]
以获取值。这将是非常快的。这些字符串中的3个串接也是一项非常特殊的任务,您可以为其提供一个额外的函数。大多数常用函数过于通用,无法以这种方式高效运行。@nobody-不起作用,您将获得“064090240”,您需要3个1、2、3位数的查找表和一些逻辑来组合它们。111、1、1不能以转换字符串的形式与1、11、11区分有关系吗?OP说它需要非常快;sprintf决不是很快。一个简单的解决方案,包括按10除法并将它们插入字符串中,如果不是我,可能会更慢非常小心地执行。@vsz:当然可以?只是对sprintf的可变函数调用和字符串解析肯定已经比所有涉及的除法慢了很多…@kris:我试过了,如果我真的非常小心地优化我的除法,使用循环展开等,我可以设法比sprintf快3倍。我仍然建议trying sprintf(或sstream)如果结果不令人满意,请继续使用更具体的解决方案。即使sprintf比StringStream快16倍多。多亏了这一点,这似乎是一种简洁的内联方式。我对使用任何库函数都很犹豫,因为调用它们的累积开销将是性能损失,因为我可能会这样做需要做100000次。你会认为这是一个快速的方法吗?这不会解决OP的编辑问题,因为多种颜色可以做相同的字符串。它显然是最简单的方式和最简单的C++惯用方法,但是速度如何?在某些情况下,OSTRIGSTATH甚至比旧的SIFTF更坏。一些测量可以很有启发性。@我已经更新了我的答案,以符合您更新的问题。我检查了我的一个系统(x86 64位,使用g++),ostringstream解决方案比我建议的直接转换(178245个周期vs 486个周期)慢大约200倍。谢谢您的输入。字节是否可以隐式地作为字符处理,或者转换为字符是否需要额外的语句?我遇到的问题是,我想将表示形式用作唯一键,但我不确定是否可以使用字符数组。虽然我想我可以有一个指向数组开头的指针,并将原始位读取到g使用数组将唯一的表示形式设置为24位字符串。这实际上非常有趣。因此uint充当它们的容器,我偏移每个字节值,使其像xyz一样位于int内。唯一的问题是每个int浪费8位,我想?@温室气体即使使用未使用的字节,也比创建更节省空间一个字符串(如果三种颜色都大于等于100,则最多可使用九个字节)。+1:2比除法快,比sprintf快近6倍,比stringstream快100倍。至少在我的系统上是这样。
os << std::hex << x << y << z;
unsigned long rgb = 0;
byte* b = reinterpret_cast<byte*>(&rgb);
b[0] = x;
b[1] = y;
b[2] = z;
// rgb is now the bytes { 0, x, y, z }
std::cout << std::hex << rgb;
void bytes2bits(unsigned char x, unsigned char y, unsigned char z, char * res)
{
    res += 24; *res-- = 0;
    unsigned xyz = (x<<16)+(y<<8)+z;
    for (size_t l = 0 ; l < 24 ; l++){
        *res-- = '0'+(xyz & 1); xyz >>= 1;
    }
unsigned int key = (x<< 16)|(y<<8)|z;
unsigned char x = (key >> 16) & 0xFF;
unsigned char y = (key >> 8) & 0xFF;
unsigned char z = key & 0xFF;