请教按位读取问题

songjinn 2009-06-12 09:40:45
MFC
因为可以做数据类型转换,所以数据类型不限,字符串或整数操作均可。
举个例子:
78 06 D6
转换成二进制后
0111 1000 0000 0110 1101 0110
需要出去前五位,然后读取15位的数据位,
即:
01111去掉
读取
000 0000 0110 1101

希望大家知道的帮忙想想方法。
...全文
150 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
songjinn 2009-06-12
  • 打赏
  • 举报
回复
我觉得都可行,但是不知道该如何实现。
78 00 06 D6 00 00 13 88 00
这些数据翻译成二进制后要统一进行操作。
01111000 00000000 00000110 11010110 00000000 00000000 00010011 10001000 00000000
先除去前五位,然后按照每15位一个数据读取,再转换成10进制整数。
lambochan 2009-06-12
  • 打赏
  • 举报
回复
DWORD a = 0x78, b = 0x06, c = 0xD6;

DWORD dwNum = ( a << 16 ) | ( b << 8 ) | c;
// 去掉前5位(加高8位dummy)并且只留15位
dwNum = ( dwNum << 13 ) >> 17;
leechrockgames 2009-06-12
  • 打赏
  • 举报
回复
a=16;
a<<1; (a=32)
a<<2; (a=64)


a=16;
a>>1; (a=8)
a>>2; (a=4)

fengrx 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liuintermilan 的回复:]
按位与不就行了
& 00000111111111111111
[/Quote]

正确。
liuintermilan 2009-06-12
  • 打赏
  • 举报
回复
按位与不就行了
& 00000111111111111111
songjinn 2009-06-12
  • 打赏
  • 举报
回复
lambochan 谢谢:)

在你的提示下问题解决了:)

跟大家共享下

(0x780006 & 0x07fff0)>>4

这样前五位清0,后四位移除,前边会用0补充。不过要记得用unsigned类型
lambochan 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 songjinn 的回复:]
引用 4 楼 lambochan 的回复:
DWORD a = 0x78, b = 0x06, c = 0xD6;

DWORD dwNum = ( a < < 16 ) | ( b < < 8 ) | c;
// 去掉前5位(加高8位dummy)并且只留15位
dwNum = ( dwNum < < 13 ) >> 17;



这个为什么要左移16位?0x78不是8位的吗?
[/Quote]

那是因为:
===========================================
78 06 D6
转换成二进制后
0111 1000 0000 0110 1101 0110
需要出去前五位,然后读取15位的数据位,
即:
01111去掉
读取
000 0000 0110 1101

============================================
你每3个Byte去除前5位,读接着的15位,忽略后面的4位

百事烟 2009-06-12
  • 打赏
  • 举报
回复
1楼
up
songjinn 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lambochan 的回复:]
DWORD a = 0x78, b = 0x06, c = 0xD6;

DWORD dwNum = ( a < < 16 ) | ( b < < 8 ) | c;
// 去掉前5位(加高8位dummy)并且只留15位
dwNum = ( dwNum < < 13 ) >> 17;
[/Quote]

这个为什么要左移16位?0x78不是8位的吗?

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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