佚名通过本文主要向大家介绍了数据压缩位操作中的一个函数bit_rot_left"位向左轮转"看不懂,望指点等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:数据压缩位操作中的一个函数bit_rot_left "位向左轮转"看不懂,望指点
解决方案1:
解决方案1:
嗯 你那个程序有错。。。我没有去调试它,不过我写了一个好用的:
#include <stdio.h>
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
void swap(unsigned char *a, unsigned char *b)
{
unsigned char tmp = *a;
*a = *b;
*b = tmp;
}
void rot1(unsigned char *bits, int size, int count)
{
int m = gcd(size, count), i, j;
unsigned char tmp;
count %= size;
count = size - count;
for (i = 0; i < m; i++)
{
tmp = bits[i];
for (j = i + count; j != i; j += count)
{
if (j > size)
j -= size;
swap(&tmp, bits + j);
}
bits[i] = tmp;
}
}
void rot2(unsigned char *bits, int size, int count)
{
int i;
unsigned char mask = ~0 << (8 - count), tmp1 = 0, tmp2;
for (i = size - 1; i >= 0; i--)
{
tmp2 = (mask & bits[i]) >> (8 - count);
bits[i] <<= count;
bits[i] |= tmp1;
tmp1 = tmp2;
}
bits[size - 1] |= tmp1;
}
void bit_rot_left(unsigned char *bits, int size, int count)
{
rot1(bits, size, count / 8);
rot2(bits, size, count % 8);
}
void print_bits(unsigned char *bits, int size)
{
int i, j;
for (i = 0; i < size; i++)
for (j = 0x80; j; j >>= 1)
printf("%d", !!(j & bits[i]));
printf("\n");
}
int main()
{
unsigned char bits[]="10010101";
print_bits(bits, 8);
bit_rot_left(bits,8,2);
printf("%s\n",bits);
print_bits(bits, 8);
return 0;
}
输出如下
0011000100110000001100000011000100110000001100010011000000110001
????????
1100010011000000110000001100010011000000110001001100000011000100
测试程序应该这样写才对:
int main()
{
unsigned char bits[3]={0x4b,0xdb,0};
bit_rot_left(bits,16,2);
printf("%#x,%#X,%#x",bits[0],bits[1],bits[2]);
}
输出是
0x2f,0x6D,0