红
3级
2008-06-14 回答
下面说一下我的看法, 还请大家指正.
64进制下, 也就是 十进制的0-63 在64进制下 占一位.
64进制每个位对应的应该就是 二进制的 6bit, 我们知道, 16进制下,每一位 对应二进制的4bit.
也就是说,只要找到6个 二进制位, 就可以换算成一个 64进制的 位.
上面是应该注意的第一点。 64=2^6 (2的6次方)
24bit的输入,我们可以存贮在一个 32bit的 unsigned long 数据类型下,
具体如下,
int temp = 0;
int Bit_64[4] = 0; /*24 bit 对应 4 位 64进制的数*/
int uReceiveInputBit= 0; (存储收到的每一个bit)
int uShiftNum = 23; (需要和 uCurrentbit一起起作用)
int uCurrentbit = 0; (对应scanf得到的bit 从左到右 是第几位);
unsigned long ulStoreAllBit = 0;
循环使用scanf 获得每一个bit的输入,
/*保证, 如果没有输入就 退出循环*/
while ( scanf("%d", &uReceiveInputBit) )
{
/*假设从第一个bit开始,*/
/*因为ulStoreAllBit 初始化为0, 故如果收到的bit为0, 就不去处理, 只处理输入bit为1的*/
if (1 == uReceiveInputBit)
{
/*最早收到的bit, 一定是占据高位的, 对应权值高*/
ulStoreAllBit |= (0x1 << (uShiftNum-uCurrentbit) );
}
/*进入下一bit的处理*/
uCurrentbit ++;
}
当上面的代码处理完后, 意味着 用户输入的 24bit ,已经都在 ulStoreAllBit 里 用 bit 占据的形式存储下来了,
假设输入为 101010111100000101100110 的 话,
ulStoreAllBit = 00000000 101010111100000101100110(B);
uCurrentbit = uShiftNum;
while (uCurrentbit >=0)
{
temp = ulStoreAllBit & (0x1 << uCurrentbit);
if (1 == temp)
{
/*最高6bit, 存储在 Bit_64[0]中, 成为4位64进制数中的最高位*/
if ( uCurrentbit >= 18 )
{
Bit_64[0] += (2的 uCurrentbit - 18 次方)
}
else
if ( uCurrentbit >= 12 )
{
Bit_64[1] += (2的 uCurrentbit - 12 次方)
}
else
if ( uCurrentbit >= 6 )
{
Bit_64[2] += (2的 uCurrentbit - 6 次方)
}
else
if ( uCurrentbit >= 0 )
{
Bit_64[3] += (2的 uCurrentbit - 0 次方)
}
}
uCurrentbit--;
}
这样,
这个24bit的二进制数 换算成 64进制数 就是 (Bit_64[0])(Bit_64[1])(Bit_64[2])(Bit_64[3])
当然,这之中存在和16进制同样的,a,b,c,d,e,f 的问题, 不过这只是个标记, 这个64进制数的位和大小是不会错的了.
当前的这个例子中,
Bit_64[0]应该= 42; Bit_64[1]应该= 60; Bit_64[2]应该= 5; Bit_64[3]应该= 38;
这里只有一个关键点, 就是64进制下, 每一位 对应 二进制下, 6bit.
我的这个想法,只是抛砖引玉, 希望出现更好的方法, 希望对你有帮助.