免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1858 | 回复: 6
打印 上一主题 下一主题

位操作问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-12 16:53 |只看该作者 |倒序浏览
1、如何简单的测试一个数值A第n位的值是1或0?
2、查两个数值前几位完全相同,比如110111和1101000的前4位相同?
谢谢

论坛徽章:
0
2 [报告]
发表于 2007-07-12 17:11 |只看该作者
原帖由 yacare 于 2007-7-12 16:53 发表
1、如何简单的测试一个数值A第n位的值是1或0?
2、查两个数值前几位完全相同,比如110111和1101000的前4位相同?
谢谢

1.对于变量,最快的当然是用平台提供的指令,例如x86上的bt指令,ia64上的tbit指令。对于常数,位移即可。
2.同样的,通过位移或掩码的方式取得你要的那几位,比较即可

论坛徽章:
0
3 [报告]
发表于 2007-07-12 17:41 |只看该作者
原帖由 yacare 于 2007-7-12 16:53 发表
1、如何简单的测试一个数值A第n位的值是1或0?
2、查两个数值前几位完全相同,比如110111和1101000的前4位相同?
谢谢

  1. 1、 a & (1 << n)
  2. 2、对于32位的机器 (x1 >> 28) ^ (x2 >> 28);
复制代码

论坛徽章:
0
4 [报告]
发表于 2007-07-12 19:04 |只看该作者
貌似a & (1 << n-1)

原帖由 zwylinux 于 2007-7-12 17:41 发表


a & (1 << n)

论坛徽章:
0
5 [报告]
发表于 2007-07-12 22:00 |只看该作者
原帖由 zx_wing 于 2007-7-12 17:11 发表

1.对于变量,最快的当然是用平台提供的指令,例如x86上的bt指令,ia64上的tbit指令。对于常数,位移即可。
....


非也,对于变量来说,bt 未必是最理想的,bt 的行为是复制某一位到 CF,对于内存变量来说,地址对齐于 1 byte 的倍数,若要检查 byte 内的某位,直接操作内存,bt 显得不理想。若想用 BT 则应:先 load 变量到 register,然后再 BT。

我提供一个较好的替代方法: 使用 RCL 指令,通过位移同样复制到 CF 中。

论坛徽章:
0
6 [报告]
发表于 2007-07-13 02:22 |只看该作者

回复 #3 zwylinux 的帖子

为啥问题2是
    2、对于32位的机器 (x1 >> 2 ^ (x2 >> 2;
我在写一个函数
u_int8_t compare (u_int32_t x1, u_int32_t x2, u_int8_t start_pos, u_int8_t end_pos);
输入: x1, x2需要比较的两个数 (输入的两个数的start_pos之前的位是相同的)
        start_pos, end_end 需要比较的起始和结束位置
输出: 比较部分中开始不同的位置,如果完全完全相同则返回0
比如compare(1100100..., 1100110..., 3, 7),返回是6。
比如compare(1100100..., 1100110..., 3, 5),返回是0。
我用的是如下函数。

u_int8_t compare (u_int32_t x1, u_int32_t x2, u_int8_t start_pos, u_int8_t end_pos) {
   u_int8_t i;
   u_int32_t r = x1 ^ x2;
   r = r << start_pos -1;
   for (i=0; i<end_pos-start_pos; i++) {
      if ((r & 0x80000000) == 0)
         break;
      r = r << 1;
   }

   if (i==0)
      return start_pos;
   else
      return i == end_pos-start_pos ? 0 : start_pos+i;
}

因为这函数会被多次调用,因此对这个函数的效率要求非常高。不知道有没其它更优的方法,比如不用for loop或者用汇编? 我对汇编没有任何概念。。。

[ 本帖最后由 yacare 于 2007-7-13 02:42 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-07-13 02:47 |只看该作者
原帖由 yacare 于 2007-7-13 02:22 发表
为啥问题2是
    2、对于32位的机器 (x1 >> 2 ^ (x2 >> 2;
我在写一个函数
u_int8_t compare (u_int32_t x1, u_int32_t x2, u_int8_t start_pos, u_int8_t end_pos);
输入: x1, x2需要比较的两个数  ...

你说的是比较前面4位,那问题不是简化了麼,我就你的提问回答而已。
如果要实现得通用一些,可以写个小函数,当然也是就一些位操作而已。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP