关于位运算

wendy_welcom 2008-02-18 01:58:06
请前辈讲一讲下面的代码的目的是什么,都做了些什么? 另外,看什么资料可以把位运算掌握得更全面呢?谢谢了。

index = ((funcno & 0x0FFF) - 1) / 8;
funcbit = 0x80 >> (((funcno & 0x0FFF) -1) % 8);
...全文
293 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wendy_welcom 2008-02-20
  • 打赏
  • 举报
回复
舉例:
funcno index funcbit BYTE table[n][8]
1001 0 80 table[0][1]
1002 0 40 table[0][2]
1003 0 20 table[0][3]
1004 0 10 table[0][4]
1005 0 8 table[0][5]
1006 0 4 table[0][6]
1007 0 2 table[0][7]
1008 0 1 table[0][8]
1009 1 80 table[1][1]

没看明白,恕俺愚钝, 没看明白
LS_Winson 2008-02-20
  • 打赏
  • 举报
回复
不好意思...我搞错了...funcbit应该是我楼上的那种值...0x80是 第 0 位的
LS_Winson 2008-02-20
  • 打赏
  • 举报
回复
funcno index funcbit BYTE table[n][8]
1001 0 80 table[0][1]
1002 0 40 table[0][2]
1003 0 20 table[0][3]
1004 0 10 table[0][4]
1005 0 8 table[0][5]
1006 0 4 table[0][6]
1007 0 2 table[0][7]
1008 0 1 table[0][8]
1009 1 80 table[1][1]

这个应该是错了吧.....
把开头的1 都去掉....
funcno index funcbit BYTE table[n][8]
1 0 0 table[0][0]
2 0 1 table[0][1]
3 0 2 table[0][2]
4 0 3 table[0][3]
5 0 4 table[0][4]
6 0 5 table[0][5]
7 0 6 table[0][6]
8 0 7 table[0][7]
9 1 0 table[1][0]

这样才对啊....
LS_Winson 2008-02-19
  • 打赏
  • 举报
回复
index = ((funcno & 0x0FFF) - 1) / 8;

以下为bit流,8个一组作为一个"字节"

假设你想访问第20个bit 那么 把funcno设为20, 则 index = 19 / 8

00000000 00000000 00000000 00000000

在这里由于是整除运算,所以有这样的关系,数字除以8的结果列表如下
0~7 0
8~15 1
16~23 2
......



n*8 ~ (n+1)*8-1 -> n (n为非负整数)

从 n*8 ~ (n+1)*8-1 这8个数都位于同一个"字节"内 除以8 时得到相同的结果 n 即该字节的下标
nobush 2008-02-19
  • 打赏
  • 举报
回复
1樓的把十六進制和二進制搞混了吧?
funcno&0x0FFF 是比較十六進制的後三位, 而 (...)/8 是二進制的後三位
funcno 十六進制後三位不可能為零!

這是一個字節比特數組,把他想象成n*8矩陣好了
為什麽要 (……-1)/8 ?
因為可以把數組下標看為1到8,而不是0到7,

funcbit拾取8的餘數剛好表示八位比特的値
因為 0x80 = 10000000 移位的結果只能是有一位上是'1',如果看成是8位數組則等價於下標

設:n= A_FUNCFLG_MAX/8 ,則table 相當於 BYTE table[n][8]
舉例:
funcno index funcbit BYTE table[n][8]
1001 0 80 table[0][1]
1002 0 40 table[0][2]
1003 0 20 table[0][3]
1004 0 10 table[0][4]
1005 0 8 table[0][5]
1006 0 4 table[0][6]
1007 0 2 table[0][7]
1008 0 1 table[0][8]
1009 1 80 table[1][1]
wendy_welcom 2008-02-19
  • 打赏
  • 举报
回复
LS_Winson 发表于:2008-02-18 23:37:28
从 funcno 中取出 低12位 并计算它位于哪个“字节”中,该值放入 index 中

怎么知道它是 计算在哪个字节中呢?谢谢

wendy_welcom 2008-02-19
  • 打赏
  • 举报
回复
index=((funcno&0x0FFF)- 1) / 8;
index=((funcno&0x0FFF)- 1) >> 3;

这两个语句是一回事么? 记得以前老师说过 右移3位相当于除以8, 但我想知道这两种写法完全相同,还是有细微的差别呢?
wendy_welcom 2008-02-19
  • 打赏
  • 举报
回复
funcno 是 地址, 还是仅仅把10进制的数字在计算机内部用16进制表示,其内涵指 第几个 位?

这两个哪一个理解得对呢?
wendy_welcom 2008-02-19
  • 打赏
  • 举报
回复
funcno
1001
1003
1004
1005
1006
1007
1008
1009

16进制?

funcno 表示访问第几位,是吧? 如果这样理解,0x1003 = 52 访问第52位,第52位却在table[0][] ?? 第一个字节上?
pptor 2008-02-19
  • 打赏
  • 举报
回复
代码多贴点出来吗
wendy_welcom 2008-02-19
  • 打赏
  • 举报
回复
舉例:
funcno index funcbit BYTE table[n][8]
1001 0 80 table[0][1]
1002 0 40 table[0][2]
1003 0 20 table[0][3]
1004 0 10 table[0][4]
1005 0 8 table[0][5]
1006 0 4 table[0][6]
1007 0 2 table[0][7]
1008 0 1 table[0][8]
1009 1 80 table[1][1]

没看明白,恕俺愚钝, 没看明白 index 和 table[][]的第二维的下标怎么得的。
baihacker 2008-02-18
  • 打赏
  • 举报
回复
关注...
LS_Winson 2008-02-18
  • 打赏
  • 举报
回复
table 定义了一个“字节”列表
从 funcno 中取出 低12位 并计算它位于哪个“字节”中,该值放入 index 中

同样取出低12位并计算 该值在 “字节”中的 “偏移”

然后检查该table中的 位(bit)是否为 0 ,是则返回OK


抽象的函数功能如下:
table 是一个列表,列表项要么是0,要么是1,然后程序收到一个下标,然后检测该项的值,为0时返回OK

具体实现中因为要节省空间,所以把0,1这些位8个一组用一个bit表示,index funcbit都是为了访问到某个与funcno对应的位所进行的运算
SUX4J 2008-02-18
  • 打赏
  • 举报
回复
除非funcno 最后3位为000否则,减一和不减没有区别。因为右移掉了

这句话没看懂。

#define funcno (USINT)(0x0008)
那么 下面这句 index = ((funcno & 0x0FFF) - 1)> > 3
具体怎么执行的?

-----------------------------------------------------------------------
上面的好像没什么意义,移位后等于0了。

前面那段没怎么看出做什么,funcno的值应该是个范围,而不是这个地方写的直接定义为0x8了,在1~~961之间。用于操作一种算法的。但是这个算法做什么就不知道了,算法大概是为了查找到table这个数组的索引和每个成员的值的关系(这个好像是废话:))。TABLE的初始化保存的值,知道了,可能可以看下,这个算法做什么的,8个funcno对应1个INDEX,对应8个值。
---------------激动了,写了一大堆,不相干的.... ……^_^
manio 2008-02-18
  • 打赏
  • 举报
回复
从哪弄来的代码?
wendy_welcom 2008-02-18
  • 打赏
  • 举报
回复
除非funcno 最后3位为000否则,减一和不减没有区别。因为右移掉了

这句话没看懂。

#define funcno (USINT)(0x0008)
那么 下面这句 index = ((funcno & 0x0FFF) - 1)> > 3
具体怎么执行的?
wendy_welcom 2008-02-18
  • 打赏
  • 举报
回复
#define MAX (USINT)(0x03C0)
#define BYTEMAX ((MAX + 7) / 8)
UCHAR table[BYTEMAX];
UCHAR funcbit; /* byte-data's current bit */

if((funcno < 1) || ((funcno & 0x0FFF) > A_FUNCFLG_MAX)) {
return(Error);
}
index = ((funcno & 0x0FFF) - 1) / 8;
funcbit = 0x80 > > (((funcno & 0x0FFF) -1) % 8);
if((table[index] & funcbit) == NULL) {
return(A_OK);
}

这是全部代码
visame 2008-02-18
  • 打赏
  • 举报
回复
把更多的代码贴出来。我们需要上下文,context最好。
Supper_Jerry 2008-02-18
  • 打赏
  • 举报
回复
index = ((funcno & 0x0FFF) - 1)>>3
除非funcno 最后3位为000否则,减一和不减没有区别。因为右移掉了。
至于目的我也看不懂,帮你顶一下

69,371

社区成员

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

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