为使用二进制补码运算和算术有移来编写一个有如下的函数:
/*Delcaretion of data type where 4 bytes are packed into an unsigned */
typedef unsigned packde_t;
/*Extrct bte from word ,return a signde integer*/
int xbyte(packed_t word ,int bytenum)
{
return
(word>>(bytenum<<3))&0xff;
}
A,这段代码错在那里?
B,给出正确的实现,只使用左右位移和一个减法!
----------------解决方案--------------------------------------------------------
也就是说,函数会抽取出指定的字节,再把它符号扩展位一个32为的int.
----------------解决方案--------------------------------------------------------
等待中...................
思考中..................
努力中.................
----------------解决方案--------------------------------------------------------
bytenum<<3
为啥是左移三位????
把bytenum乘以8???
----------------解决方案--------------------------------------------------------
对,2的3次方,在乘上它的基数bytenum
----------------解决方案--------------------------------------------------------
int xbyte(packed_t word ,int bytenum)
{
return (word>>(bytenum<<3))&0xff;
}
word >> (bytenum * 8) &0xff; //
因为 是 signed char 类型。(11111111 为 -1)
缺少二进制补码的代码
int xbyte(packde_t word, int bytenum)
{
int i;
i = (word >>(bytenum << 3)) & 0xff;
return (i & 0x80) ? (i |= (~0xff)) : i;
}
/* 最好加入 bytenum 的检测*/
[此贴子已经被作者于2007-11-4 18:37:18编辑过]
----------------解决方案--------------------------------------------------------
/* 测试程序 */
#include <stdio.h>
typedef unsigned packde_t;
union x16 {
unsigned int a;
signed char ar[4];
} st;
int xbyte(packde_t word, int bytenum)
{
int i;
i = (word >>(bytenum << 3)) & 0xff;
return (i & 0x80) ? (i |= (~0xff)) : i;
}
int main(void)
{
int i;
st.ar[0] = -1;
st.ar[1] = -2;
st.ar[3] = -3;
st.ar[4] = 4;
i = xbyte(st.a, 3);
printf("%d\n", i);
getchar();
return 0;
}
[此贴子已经被作者于2007-11-4 18:39:01编辑过]
----------------解决方案--------------------------------------------------------
如果有符号数的话,比如-1,char的时候是0xff int的时候是0xff ff ff ff
而按楼主的这个程序却扩展成了0x00 00 00 ff
这就是错误的地方吧
----------------解决方案--------------------------------------------------------
缺少符号扩展
int xbyte(packed_t word ,int bytenum)
{
return (((word>>(bytenum<<3))&0x80)?((word>>(bytenum<<3))&0xff|0xffffff00):((word>>(bytenum<<3))&0xff));
}
----------------解决方案--------------------------------------------------------
谢谢大家!
----------------解决方案--------------------------------------------------------