社区
C语言
帖子详情
关于位运算
wendy_welcom
2008-02-18 01:58:06
请前辈讲一讲下面的代码的目的是什么,都做了些什么? 另外,看什么资料可以把位运算掌握得更全面呢?谢谢了。
index = ((funcno & 0x0FFF) - 1) / 8;
funcbit = 0x80 >> (((funcno & 0x0FFF) -1) % 8);
...全文
293
19
打赏
收藏
关于位运算
请前辈讲一讲下面的代码的目的是什么,都做了些什么? 另外,看什么资料可以把位运算掌握得更全面呢?谢谢了。 index = ((funcno & 0x0FFF) - 1) / 8; funcbit = 0x80 >> (((funcno & 0x0FFF) -1) % 8);
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 000
0
0000 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否则,减一和不减没有区别。因为右移掉了。
至于目的我也看不懂,帮你顶一下
Java进制转换和
位运算
专题
本课程是零基础学JAVA课程的第二阶段的课程,课程内容详实、细致,讲解通俗易懂!内容包括:Java中的进制转换原理,十进制和二进制、八进制、十六进制的互相转换规律,
位运算
原理,按位与、按位或、按位取反、左移、右移、无符号右移的讲解!
位运算
全面总结,关于
位运算
看这篇就够了
关于
位运算
的奇技淫巧,看完这篇你就能灵活使用
位运算
了。
C++中的
位运算
基本知识 最近博主在刷Leedcode题,很多人都是采用
位运算
来解题的,看的我满脸雾水,所以上网收集了一下c++中关于
位运算
的知识,为此总结一下,有不妥的地方还望指正。 程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算
说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是11...
关于
位运算
的理解——与、或、异或、取反、左移、右移
文章目录什么是
位运算
运算符号运算说明位逻辑运算结果与运算—— &或运算—— |异或运算—— ^取反运算—— ~左移运算—— <<右移运算—— >> 什么是
位运算
程序中的数在计算机中都是采用的二进制存储方式,
位运算
就是直接对整数在内存中的二进制位进行操作。 运算符号 符号 含义 运算规则 & 按位与 当两个位都是1时,结果才为1,可以用来判断奇偶 | 按位或 当两个位都是0时,结果才为0 ^ 按位异或 两个位相同时为0,相异时为1,可以用来统计
关于
位运算
中 取反~ 的计算原理说明(肯定看得懂系列)
按
位运算
中取反的计算原理1:前言2:例子与解析3:公式总结 1:前言 前言:二进制按
位运算
包括有 按位或&,按位与|,按位异或^,按位取反~, 还有左移<<, 右移>> 等操作,都是非常容易理解和应用的。 除了本篇要讲的 按位取反操作,相信各位在第一次使用这个运算的时候一定都被它的密之规则迷惑,输出结果与我们的预期结果不一,虽然在多次试验之后你记住了他的输出结果...
C语言
69,371
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章