On Wednesday, March 09, 2011 15:35:29 Kai Meyer wrote: > On 03/09/2011 03:41 PM, Tom wrote: > > What is the most efficient way of implement a rotation of ubyte[4] array? > > > > By rotation I mean: rotateRight([1, 2, 3, 4]) -> [4, 1, 2, 3] > > > > TIA, > > Tom; > > I don't know of anything more efficient than: > ubyte[4] bytes = [1,2,3,4]; > bytes = bytes[$-1] ~ bytes[0..$-1]; // Rotate left
I'm stunned that this works. I'd even consider reporting it as a bug. You're concatenating a ubyte[] ont a ubyte... > bytes = bytes[1..$] ~ bytes[0]; // Rotate right You're concatenating a ubyte onto a slice of the array (so it's ubyte[] instead of ubyte[4]). That will result in a temporary whose value will then be assigned to the original ubyte[4]. > Both static arrays and dynamic arrays (ubyte[] bytes = [1,2,3,4];) > perform about the same between 1 and 10 milling rotations in either > direction. I think a temporary array might be created for the rhs, and > then have the values of the rhs array copied to the lhs array, but I > don't know. With static arrays, I'm not sure there would be a way to get > around it with out at least a temporary value for the one that's moving > between the first and last positions. Honestly, given that this is 4 ubytes, I would fully expect that the fastest way to do this would involve casting it to a unit and shifting it - something along the lines of what Bearophile suggested. I'd be _very_ suprised if this implementation were faster, since it involves creating a temporary array. - Jonathan M Davis