C:\test\C>bufswap 536870912 268435456 2 ### 2^29 2^28
size:536870912 offset;268435456
[ 0 1 ... 268435454 268435455 ^ 268435456 268435457 ... 536870910 536870911 ]
[ 268435456 268435457 ... 536870910 536870911 ^ 0 1 ... 268435454 268435455 ]
iterative: swaps:536870912 took 4.364767872 secs.
[ 0 1 ... 268435454 268435455 ^ 268435456 268435457 ... 536870910 536870911 ]
[ 268435456 268435457 ... 536870910 536870911 ^ 0 1 ... 268435454 268435455 ]
recursive: swaps:268435456 took 2.476348362 secs.
####
C:\test\C>bufswap 30000000 20000000 2
size:30000000 offset;20000000
[ 0 1 ... 19999998 19999999 ^ 20000000 20000001 ... 29999998 29999999 ]
[ 20000000 20000001 ... 29999998 29999999 ^ 0 1 ... 19999998 19999999 ]
iterative: swaps:30000000 took 0.235516729 secs.
[ 0 1 ... 19999998 19999999 ^ 20000000 20000001 ... 29999998 29999999 ]
[ 20000000 20000001 ... 29999998 29999999 ^ 0 1 ... 19999998 19999999 ]
recursive: swaps:20000000 took 0.163142653 secs.
####
C:\test\C>bufswap 536870855 268435399 2 ### 2^28+prime prime
size:536870855 offset;268435399
[ 0 1 ... 268435397 268435398 ^ 268435399 268435400 ... 536870853 536870854 ]
[ 268435399 268435400 ... 536870853 536870854 ^ 0 1 ... 268435397 268435398 ]
iterative: swaps:536870855 took 23.912365889 secs.
[ 0 1 ... 268435397 268435398 ^ 268435399 268435400 ... 536870853 536870854 ]
[ 268435399 268435400 ... 536870853 536870854 ^ 0 1 ... 268435397 268435398 ]
recursive: swaps:536870854 took 3.633964430 secs.
####
C:\test\C>bufswap 2097147 1048571 2 ### 2^20+prime prime
size:2097147 offset;1048571
[ 0 1 ... 1048569 1048570 ^ 1048571 1048572 ... 2097145 2097146 ]
[ 1048571 1048572 ... 2097145 2097146 ^ 0 1 ... 1048569 1048570 ]
iterative: swaps:2097147 took 0.050917112 secs.
[ 0 1 ... 1048569 1048570 ^ 1048571 1048572 ... 2097145 2097146 ]
[ 1048571 1048572 ... 2097145 2097146 ^ 0 1 ... 1048569 1048570 ]
recursive: swaps:2097146 took 0.022471381 secs.
[ 0 1 ... 1048569 1048570 ^ 1048571 1048572 ... 2097145 2097146 ]
[ 1048571 1048572 ... 2097145 2097146 ^ 0 1 ... 1048569 1048570 ]
reversive: swaps:2097146 took 0.030067538 secs.
C:\test\C>bufswap 33554429 16777213 2 ### 2^24+prime prime
size:33554429 offset;16777213
[ 0 1 ... 16777211 16777212 ^ 16777213 16777214 ... 33554427 33554428 ]
[ 16777213 16777214 ... 33554427 33554428 ^ 0 1 ... 16777211 16777212 ]
iterative: swaps:33554429 took 0.519861854 secs.
[ 0 1 ... 16777211 16777212 ^ 16777213 16777214 ... 33554427 33554428 ]
[ 16777213 16777214 ... 33554427 33554428 ^ 0 1 ... 16777211 16777212 ]
recursive: swaps:33554428 took 0.212679449 secs.
[ 0 1 ... 16777211 16777212 ^ 16777213 16777214 ... 33554427 33554428 ]
[ 16777213 16777214 ... 33554427 33554428 ^ 0 1 ... 16777211 16777212 ]
reversive: swaps:33554428 took 0.275975182 secs.
C:\test\C>bufswap 134217723 67108859 2 ### 2^26+prime prime
size:134217723 offset;67108859
[ 0 1 ... 67108857 67108858 ^ 67108859 67108860 ... 134217721 134217722 ]
[ 67108859 67108860 ... 134217721 134217722 ^ 0 1 ... 67108857 67108858 ]
iterative: swaps:134217723 took 2.986443308 secs.
[ 0 1 ... 67108857 67108858 ^ 67108859 67108860 ... 134217721 134217722 ]
[ 67108859 67108860 ... 134217721 134217722 ^ 0 1 ... 67108857 67108858 ]
recursive: swaps:134217722 took 0.957572077 secs.
[ 0 1 ... 67108857 67108858 ^ 67108859 67108860 ... 134217721 134217722 ]
[ 67108859 67108860 ... 134217721 134217722 ^ 0 1 ... 67108857 67108858 ]
reversive: swaps:134217722 took 1.185514126 secs.
C:\test\C>bufswap 268435417 134217689 2 ### 2^27+prime prime
size:268435417 offset;134217689
[ 0 1 ... 134217687 134217688 ^ 134217689 134217690 ... 268435415 268435416 ]
[ 134217689 134217690 ... 268435415 268435416 ^ 0 1 ... 134217687 134217688 ]
iterative: swaps:268435417 took 11.702352647 secs.
[ 0 1 ... 134217687 134217688 ^ 134217689 134217690 ... 268435415 268435416 ]
[ 134217689 134217690 ... 268435415 268435416 ^ 0 1 ... 134217687 134217688 ]
recursive: swaps:268435416 took 1.888340531 secs.
[ 0 1 ... 134217687 134217688 ^ 134217689 134217690 ... 268435415 268435416 ]
[ 134217689 134217690 ... 268435415 268435416 ^ 0 1 ... 134217687 134217688 ]
reversive: swaps:268435416 took 2.337291168 secs.
####
abcdef123
321fedcba reverse the entire buffer.
123fedcba reverse the smaller partition.
123abcdef reverse the larger partition.
####
U32 reverseBuffer( register U64 *p, const U32 start, const U32 size ) {
register U32 i, swaps = 0;
const U32 half = size >> 1;
for( i = start; i < half; ++i ) {
swapElems( p, i, size -1 -i );
++swaps;
}
return swaps;
}
U32 xchgBufferV( U64 *p, U32 size, U32 offset ) {
register U32 swaps = 0;
swaps += reverseBuffer( p, 0, size );
swaps += reverseBuffer( p, 0, size - offset );
swaps += reverseBuffer( p + (size - offset), 0, offset );
return swaps;
}