当前位置: 代码迷 >> C语言 >> [讨论]位移!
  详细解决方案

[讨论]位移!

热度:286   发布时间:2007-11-04 17:03:10.0
[讨论]位移!
你刚刚开始为一家公司工作,他们要实现一组过程来操作一个数据结构,要将4个有符号字节封装成一个32为的unsigned .在字中的字节是从0(底位)到,3(高),你被分配的任务是:
为使用二进制补码运算和算术有移来编写一个有如下的函数:
/*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,给出正确的实现,只使用左右位移和一个减法!
搜索更多相关的解决方案: 位移  二进制  unsigned  word  int  

----------------解决方案--------------------------------------------------------

也就是说,函数会抽取出指定的字节,再把它符号扩展位一个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));
}
----------------解决方案--------------------------------------------------------

谢谢大家!


----------------解决方案--------------------------------------------------------
  相关解决方案