搜索
bottom↓
回复: 22

用什么样的办法,可以将24位数据变成3个8位数据?

[复制链接]

出0入0汤圆

发表于 2012-10-16 09:05:55 | 显示全部楼层 |阅读模式
用什么样的办法,可以将24位数据变成3个8位数据,效率最高
比如,十进制的5592323变成0X55 0X55 0X03

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-10-16 09:18:45 | 显示全部楼层
别跟我说要先把十进制转换为16进制再分成3个字节的吧?

出0入0汤圆

发表于 2012-10-16 09:22:21 | 显示全部楼层
struct & union...

出0入0汤圆

 楼主| 发表于 2012-10-16 09:22:42 | 显示全部楼层
楼上,,,是的,就是这个意思

出0入0汤圆

 楼主| 发表于 2012-10-16 09:23:27 | 显示全部楼层
或者您有更好的办法吗?谢谢

出0入0汤圆

发表于 2012-10-16 09:27:54 | 显示全部楼层
搞个char 8bit 类型的指针指向这个变量,然后用将指针值的位置的一个字节取出来放到你的8bit变量中,取完指针加一,三次就完事了~

出0入0汤圆

 楼主| 发表于 2012-10-16 09:28:41 | 显示全部楼层
楼上的大侠们啊,给个示范代码?

出0入362汤圆

发表于 2012-10-16 09:32:55 | 显示全部楼层
xinzhi1986 发表于 2012-10-16 09:27
搞个char 8bit 类型的指针指向这个变量,然后用将指针值的位置的一个字节取出来放到你的8bit变量中,取完指 ...

不知道lz想干啥。。。RGB么?
union {
    uint8_t a, r, g, b;   //顺序自己调整,不同环境可能不一样,a占位用
    uint32_t   color;
} t;

......
给t.color赋那个24位的值,然后t.r, t.g, t.b就是需要的结果

出0入0汤圆

 楼主| 发表于 2012-10-16 09:35:01 | 显示全部楼层
十进制的5592323变成0X55 0X55 0X03

出0入362汤圆

发表于 2012-10-16 09:39:21 | 显示全部楼层
jasonguo83 发表于 2012-10-16 09:35
十进制的5592323变成0X55 0X55 0X03

到底想用来干啥? 机器里是不分十进制十六进制的。。。 只在输入输出时有用


只要输出的话,这样就行
uint32_t = 5592323;
printf( "0x%02x 0x%02x 0x%02x", 0xff&(t>>16), 0xff&(t>>8), 0xff&t );

出0入0汤圆

 楼主| 发表于 2012-10-16 09:40:28 | 显示全部楼层
是这样的亲, 我想将这个数值保存在EEPROM里面。就只能分为3个字节了。

出0入0汤圆

发表于 2012-10-16 09:43:17 | 显示全部楼层
jasonguo83 发表于 2012-10-16 09:35
十进制的5592323变成0X55 0X55 0X03

8楼的共用体就是实现办法~
代码不是都已经给你了么
union {
        uint8_t a, r, g, b;   //顺序自己调整,不同环境可能不一样,a占位用
     uint32_t   color;
} t;
t=5592323;
完了~

这个时候如果是从高到低存放的
那么t.r=0x55  t.g=0x55 t.b=0x03
直接调用t.r t.g t.b就好了

出0入0汤圆

发表于 2012-10-16 09:47:39 | 显示全部楼层
uint32 X=5592323
uint8 a,b,c;
a=(X&0xFF0000)>>16;
b=(X&0x00FF00)>>8;
c=X&0x0000FF;

出0入0汤圆

发表于 2012-10-16 10:15:19 | 显示全部楼层
不知道能不能这样,以前的VC是可以的
uint32 X=5592323
uint8 a,b,c,d,*p=&x;
a=*p;
b=*(p+1);
c=*(p+2);
d=*(p+3);

出0入0汤圆

 楼主| 发表于 2012-10-16 10:26:32 | 显示全部楼层
多谢各位,很早就应该多谢了。就是论坛回复只能一个小时5次,我这初级用户等级啊。。。

出0入0汤圆

发表于 2012-10-16 10:30:23 | 显示全部楼层
*( ( (u8*) (&u32x) )+n) 这种指针变换最快,通常是由编译器直接转换使用,就是当成8位变量用了;
再就是u8指针变量了,速度如何看具体情况
还有共用体,优化好了也是当成u8变量用的,看环境和用法了
最啰嗦的就是位移或倍率了,速度不详,在KEIL 51中基本上是当变量用的,在其他编译器中真有计算的,看环境了,不过优点就是不用担心大小端问题

出0入0汤圆

 楼主| 发表于 2012-10-16 10:33:00 | 显示全部楼层
mcu5i51 可以具体给点代码吗? 性能最快的。

出0入0汤圆

发表于 2012-10-16 10:40:38 | 显示全部楼层
嘎嘎

出0入0汤圆

 楼主| 发表于 2012-10-16 11:04:42 | 显示全部楼层
嘻嘻嘻。。。

出0入0汤圆

发表于 2012-10-16 13:02:43 | 显示全部楼层
jasonguo83 发表于 2012-10-16 09:35
十进制的5592323变成0X55 0X55 0X03

//一个长整形数据的4字节
   #define  U32HH8( xxx )    ((uint8_t *)& (xxx) )[3]
   #define  U32H8( xxx )     ((uint8_t *)& (xxx) )[2]
   #define  U32L8( xxx )     ((uint8_t *)& (xxx) )[1]
   #define  U32LL8( xxx )    ((uint8_t *)& (xxx) )[0]

使用:
volatile uint32_t nnn = 5592323;
volatile uint8_t n1,n2,n3;

        n1 = _U32H8(nnn);   
        n2 = _U32L8(nnn);
        n3 = _U32LL8(nnn);

结果:
n1 = 0x55
n2 = 0x55
n3 = 0x03

出0入0汤圆

发表于 2012-10-16 13:18:02 | 显示全部楼层
BXAK 发表于 2012-10-16 13:02
//一个长整形数据的4字节
   #define  U32HH8( xxx )    ((uint8_t *)& (xxx) )[3]
   #define  U32H8(  ...

再补充:

【大小端】
Keil-C51 大端寻址
SDCC-C51 小端寻址
AVRGCC   小端寻址

如果将一个32位的整数0x12345678存放到一个长整型变量(long)中,
这个整型变量采用大端或者小端模式在内存中的存储由下表所示。
为简单起见,
用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),
用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。
  
地址偏移        大端模式        小端模式
0x00            12(OP0)         78(OP3)
0x01            34(OP1)         56(OP2)
0x02            56(OP2)         34(OP1)
0x03            78(OP3)         12(OP0)

所以如果是keil C51,则应该:
//一个长整形数据的4字节
    #define  U32HH8( xxx )    ((uint8_t *)& (xxx) )[0]
    #define  U32H8( xxx )     ((uint8_t *)& (xxx) )[1]
    #define  U32L8( xxx )     ((uint8_t *)& (xxx) )[2]
    #define  U32LL8( xxx )    ((uint8_t *)& (xxx) )[3]

出0入0汤圆

 楼主| 发表于 2012-10-16 14:42:47 | 显示全部楼层
太感谢了。

出0入0汤圆

发表于 2012-10-17 09:31:03 | 显示全部楼层
共用体的是正解
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表