原理



#include"stdio.h"
#include <time.h>
#include <stdlib.h>
typedef unsigned char u8;
typedef unsigned int u32;
typedef unsigned long long u64;
#define ROTR64(x,n) (((x)>>(n))|((x)<<(64-(n))))
#define ROTR32(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
#define U32BIG(x) (x)
#define U64BIG(x) (x)
//u8 in[8] ;u32 out[2]。
void zxfto_bit_interleaving(u32 * out, u8 * in) {
u32 t0 = U32BIG(((u32*)in)[0]);
u32 t1 = U32BIG(((u32*)in)[1]);
u32 r0, r1;
r0 = (t0 ^ (t0 >> 1)) & 0x22222222, t0 ^= r0 ^ (r0 << 1);
r0 = (t0 ^ (t0 >> 2)) & 0x0C0C0C0C, t0 ^= r0 ^ (r0 << 2);
r0 = (t0 ^ (t0 >> 4)) & 0x00F000F0, t0 ^= r0 ^ (r0 << 4);
r0 = (t0 ^ (t0 >> 8)) & 0x0000FF00, t0 ^= r0 ^ (r0 << 8); //t0 odd(双) even(单)
r1 = (t1 ^ (t1 >> 1)) & 0x22222222, t1 ^= r1 ^ (r1 << 1);
r1 = (t1 ^ (t1 >> 2)) & 0x0C0C0C0C, t1 ^= r1 ^ (r1 << 2);
r1 = (t1 ^ (t1 >> 4)) & 0x00F000F0, t1 ^= r1 ^ (r1 << 4);
r1 = (t1 ^ (t1 >> 8)) & 0x0000FF00, t1 ^= r1 ^ (r1 << 8); //t1 odd(双) even(单)
out[0] = (t1 & 0xFFFF0000) | (t0 >> 16); // t1.odd|t0.odd
out[1] = (t1 << 16)| (t0 & 0x0000FFFF); // t1.even|t0.even
}
//u8 out[8] ;u32 in[2]。
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
void zxffrom_bit_interleaving(u8 * out, u32 * in) {
u32 t1 = (in[0] & 0xFFFF0000) | (in[1] >> 16);
u32 t0 = (in[1] & 0x0000FFFF) | (in[0] << 16);
u32 r0, r1;
r0 = (t0 ^ (t0 >> 8)) & 0x0000FF00, t0 ^= r0 ^ (r0 << 8); \
r0 = (t0 ^ (t0 >> 4)) & 0x00F000F0, t0 ^= r0 ^ (r0 << 4); \
r0 = (t0 ^ (t0 >> 2)) & 0x0C0C0C0C, t0 ^= r0 ^ (r0 << 2); \
r0 = (t0 ^ (t0 >> 1)) & 0x22222222, t0 ^= r0 ^ (r0 << 1); \
r1 = (t1 ^ (t1 >> 8)) & 0x0000FF00, t1 ^= r1 ^ (r1 << 8); \
r1 = (t1 ^ (t1 >> 4)) & 0x00F000F0, t1 ^= r1 ^ (r1 << 4); \
r1 = (t1 ^ (t1 >> 2)) & 0x0C0C0C0C, t1 ^= r1 ^ (r1 << 2); \
r1 = (t1 ^ (t1 >> 1)) & 0x22222222, t1 ^= r1 ^ (r1 << 1); \
*((u64*)out) = ((u64)t1 << 32 | t0);
//out = ((u64)t1 << 32 | t0);
}
void test() {
u32 temp[2] = { 0 }, t[2];
int i, j, shift=2, shiftTemp;
unsigned char in[8] = {0 };
//u64 temp64 = 0x00000055000000aa, temp1;
u64 temp64 = 0x000000290000005a, temp1;
//srand((unsigned)time(NULL));
for (j = 0; j < 4; j++) {
shift = j;
//shift = rand() % 20 + 3;
//temp64 = rand();
printf("\nshift:%2d in:%016llx \n", shift, temp64);
//////////////////////
printf("ROTR64: ");
temp1 = ROTR64(temp64, shift);
printf("out:%016llx\n", temp1);
//////////////////////
for (i = 0; i < 8; i++) {
in[i]=((u8*)&temp64)[i];
}
//begin
printf("BIT_INTERVEL: \nin(u8倒叙输出):\t\t\t ");
for (i = 7; i >=0; i--) {
printf("%02x", in[i]);
}
printf("\n");
zxfto_bit_interleaving(temp, in);
printf("interleaving(偶数,奇数 u32类型):%08x %08x\n", temp[0], temp[1]);
printf("未移位前转换格式(是否与输入相同):");
zxffrom_bit_interleaving(in, temp);
for (i = 7; i >= 0; i--) {
printf("%02x", in[i]);
}
printf("\n");
shiftTemp = 0;
shiftTemp = shift / 2;
if (shift % 2 != 0) {
t[0] = ROTR32(temp[1], shiftTemp+1);
t[1] = ROTR32(temp[0], shiftTemp);
}
else {
t[0] = ROTR32(temp[0], shiftTemp);
t[1] = ROTR32(temp[1], shiftTemp);
}
printf("循环移位\t :shift=%d %08x ; %08x\n转换格式\t out: ", shiftTemp, t[0], t[1]);
zxffrom_bit_interleaving(in, t);
for (i = 7; i >= 0; i--) {
printf("%02x", in[i]);
}
printf("\n");
}
}
本文深入探讨位交错(bit interleaving)的原理,揭示这种技术在数据处理和编码中的应用。
9793





