移位操作

banmiton 2009-12-02 01:58:55
一个int类型,通过移位操作取其高字节和低字节:
如buf[0]=len<<4;那么buf[0]是存储len的低字节吗?
如buf[1]=len<<4;那么buf[1]是存储len的高字节吗?
...全文
112 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我前面说#1有错误,实际是我错了。

刚看了类型转换,int转short确实只拷贝低16位,不考虑sign的。
FollowYourHeart 2009-12-04
  • 打赏
  • 举报
回复
移位相对而言比较麻烦,不好记。推荐还是用位域来炒作比较方便。刚刚在C++里回了一个类似的问题。以下代码或者可以参考下。
#include "Stdio.h"
#include "Conio.h"
void PrintIntByte(int);

int main(void)
{
int a= 'A';int b= 'B';int c= 'C';
PrintIntByte(a);
PrintIntByte(b);
PrintIntByte(c);

getch();
return 0;
}

void PrintIntByte(int aInt)
{

struct IntByte
{
int Part1:16;
int Part2:16;
};
union MyInt
{
int aInt;
struct IntByte aIntByte;
};

union MyInt x;
char s[25];
x.aInt = aInt;

printf("%s\n",itoa(x.aIntByte.Part1,s,2));
printf("%s\n",itoa(x.aIntByte.Part2,s,2));
}
bobommsky 2009-12-03
  • 打赏
  • 举报
回复
void GetByte(int src,char *low1,char *low2,char *high1,char *high2)
{
*low1=(char)(src&0x000000ff);
*low2=(char)((src&0x0000ff00)>>8);
*high1=(char)((src&0x00ff0000)>>16);
*high2=(char)((src&0xff000000)>>24);
}
分别提取每个字节。
  • 打赏
  • 举报
回复
看错了,是#1有错误。。。
kostion 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jack010love 的回复:]
当然不是! int 是32位的! short buf[2]={0,0};int len;
buf[0]=len; //这样就可以获得len的低16位;
bud[1]=len>>16; //这样就可以获得len的高16位;
需要N位就移动32-N位;
[/Quote]
  • 打赏
  • 举报
回复
2# 有错误,如果len是负数就会把符号copy过来。


int len, buf[2];
buf[0] = len & 0xff; // 低
buf[1] = len >> 16; // 高
macrojj 2009-12-02
  • 打赏
  • 举报
回复
应该是移16位
deng1243 2009-12-02
  • 打赏
  • 举报
回复

int len,buf[2];
buf[0]=len&0x00ff;//buf[0]存储len的低字节
buf[1]=len>>8;//buf[1]存储len的高字节
jack010love 2009-12-02
  • 打赏
  • 举报
回复
当然不是! int 是32位的! short buf[2]={0,0};int len;
buf[0]=len; //这样就可以获得len的低16位;
bud[1]=len>>16; //这样就可以获得len的高16位;
需要N位就移动32-N位;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧