社区
C语言
帖子详情
关于位运算
wendy_welcom
2008-02-18 01:58:06
请前辈讲一讲下面的代码的目的是什么,都做了些什么? 另外,看什么资料可以把位运算掌握得更全面呢?谢谢了。
index = ((funcno & 0x0FFF) - 1) / 8;
funcbit = 0x80 >> (((funcno & 0x0FFF) -1) % 8);
...全文
319
19
打赏
收藏
关于位运算
请前辈讲一讲下面的代码的目的是什么,都做了些什么? 另外,看什么资料可以把位运算掌握得更全面呢?谢谢了。 index = ((funcno & 0x0FFF) - 1) / 8; funcbit = 0x80 >> (((funcno & 0x0FFF) -1) % 8);
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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否则,减一和不减没有区别。因为右移掉了。
至于目的我也看不懂,帮你顶一下
位运算
——优选算法
按位与:&两者为真(1)才为真(1),也可以理解为只要有假(0)就一定为假(0),如下:按位或:|只要有一个是真(1)则为真(1),否则为假(0)按位异或:^相同为假(0),相异为真(1),如下:1==异或(^)运算规律:对任意常数a,b,c有:按位取反:~真(1)变为假(0),假(0)变为真(1),如下:
位运算
的优先级关于
位运算
的优先级是一个让人很头疼的事情,不过也很好解决,直接简单粗暴多加括号就行,就像写宏定义一样。
关于
位运算
的理解——与、或、异或、取反、左移、右移
文章目录什么是
位运算
运算符号运算说明位逻辑运算结果与运算—— &或运算—— |异或运算—— ^取反运算—— ~左移运算—— <<右移运算—— >> 什么是
位运算
程序中的数在计算机中都是采用的二进制存储方式,
位运算
就是直接对整数在内存中的二进制位进行操作。 运算符号 符号 含义 运算规则 & 按位与 当两个位都是1时,结果才为1,可以用来判断奇偶 | 按位或 当两个位都是0时,结果才为0 ^ 按位异或 两个位相同时为0,相异时为1,可以用来统计
位运算
的相关题目
位运算
的相关题目
C++ 算法篇
位运算
学习目标 1. 理解与掌握 C++ 中的
位运算
。 2. 灵活应用
位运算
优化程序。 任何信息在计算机中都是采用二进制表示的,数据在计算机中是以补码形式存储的,
位运算
就是直接对整数在内存中的二进制位进行运算。由于
位运算
直接对内存数据进行操作,不需要转换成十进制,因此处理速度非常快,在信息学竞赛中往往可以优化理论时间复杂度的系数。同时,一个整数的各个二进制位互不影响,利用
位运算
的一些技巧可以帮...
位运算
的定义、原理及应用
因为在计算机内存中,数都是以二进制的形式储存,所以对二进制数据直接进行运算可以大大加快程序的性能和运算效率。而
位运算
还有很多奇妙的应用,下面我将会从
位运算
符的基本概念进行论述,并举例说明常见
位运算
符的应用。
C语言
70,020
社区成员
243,265
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章