| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1882 人关注过本帖
标题:[讨论]位移!
只看楼主 加入收藏
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
 问题点数:0 回复次数:18 
[讨论]位移!
你刚刚开始为一家公司工作,他们要实现一组过程来操作一个数据结构,要将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 
2007-11-04 17:03
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

也就是说,函数会抽取出指定的字节,再把它符号扩展位一个32为的int.


方寸之内,剖天下; 方坛之内,析自我;
2007-11-04 17:05
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
等待中...................
思考中..................
努力中.................

方寸之内,剖天下; 方坛之内,析自我;
2007-11-04 17:06
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 

bytenum<<3

为啥是左移三位????

把bytenum乘以8???


[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-11-04 17:29
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

对,2的3次方,在乘上它的基数bytenum


方寸之内,剖天下; 方坛之内,析自我;
2007-11-04 17:35
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 


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编辑过]


—>〉Sun〈<—
2007-11-04 17:40
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 

/* 测试程序 */

#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编辑过]


—>〉Sun〈<—
2007-11-04 18:23
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 

如果有符号数的话,比如-1,char的时候是0xff int的时候是0xff ff ff ff
而按楼主的这个程序却扩展成了0x00 00 00 ff
这就是错误的地方吧


英者自知,雄者自胜
2007-11-04 18:27
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
缺少符号扩展
int xbyte(packed_t word ,int bytenum)
{
return (((word>>(bytenum<<3))&0x80)?((word>>(bytenum<<3))&0xff|0xffffff00):((word>>(bytenum<<3))&0xff));
}
2007-11-04 18:34
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

谢谢大家!


方寸之内,剖天下; 方坛之内,析自我;
2007-11-04 18:42
快速回复:[讨论]位移!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016747 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved