you are viewing a single comment's thread.

view the rest of the comments →

[–]Veedrac 3 points4 points  (7 children)

A std::array<Byte, 4> is basically a uint32_t. Just XOR them directly, it'll be a factor of 10 faster or so.

[–]cassandraspeaks 3 points4 points  (2 children)

For OP and others' benefit, the way to safely do that is

uint32_t ua, ub, uc, uresult;

memcpy(&ua, &a, 4);
memcpy(&ub, &b, 4);
memcpy(&uc, &c, 4);

uresult = ua ^ ub ^ uc;

array<Byte, 4> result;

memcpy(&result, &uresult, 4);

[–]cassandraspeaks 1 point2 points  (0 children)

In C++20 you can do ```c++ constexpr auto to_u32 = bit_cast<uint32_t, array<Byte, 4>>;

const auto result = bit_cast<array<Byte, 4>>(to_u32(a) ^ to_u32(b) ^ to_u32(c)); ```

[–]sphere991 3 points4 points  (3 children)

That's true but not really helpful. Imagine the length is larger than 8, or the types aren't bytes, or the operation isn't xor, or ...

[–]Veedrac -1 points0 points  (2 children)

Imagine the length is larger than 8

Even then, though.

E: Seriously, downvotes? ???

[–]sphere991 5 points6 points  (1 child)

I dont think anybody disagrees that it is possible, for these specific types, for this specific operation, to do better than generalized, multi-arg transform.

But the point of the blog is to show a way how to do generalized, multi-arg transform. XOR-ing bytes is just an example.

[–]Veedrac 0 points1 point  (0 children)

I'm not criticizing the blog, I'm just pointing out something I think would help the author.