Chinaunix首页 | 论坛 | 博客
  • 博客访问: 810793
  • 博文数量: 118
  • 博客积分: 2067
  • 博客等级: 大尉
  • 技术积分: 1751
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-17 14:27
文章存档

2016年(1)

2013年(1)

2012年(3)

2011年(26)

2010年(47)

2009年(40)

分类: LINUX

2011-03-30 13:20:00

头文件:#include

17         j = ffs(0x0);
 18         printk(" j = %x \n", j); // j=0, 没有找到1
 19         j = ffs(0x05);
 20         printk(" j = %x \n", j); // j=0x1, 右边第1位 0000 0101
 21         j = ffs(0x50);
 22         printk(" j = %x \n", j); // j=0x5, 右边第5位,0101 0000
 23
 24         j = ffz(0x0);
 25         printk(" j = %x \n", j); // j=0, 右边第0位
 26         j = ffz(0x05);
 27         printk(" j = %x \n", j); // j=0x1, 右边第1位 0000 0101
 28         j = ffz(0xffffffff);
 29         printk(" j = %x \n", j); // j=0x20=32 从右数为32个1,没有0,
return value:
 j = 0
 j = 1
 j = 5

 j = 0
 j = 1
 j = 20

结论:ffs位数从1开始数,即从右到左为1,2,3...
      ffz从0开始数。

另:test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
    设置第nr位,从右边0位开始,并返回原值。
    test_and_clear_bit
(unsigned long nr, volatile unsigned long *addr)
   
清除第nr位,从0位开始数。
set_bit(int nr, volatile unsigned long *addr)
clear_bit(int nr, volatile unsigned long *addr)
change_bit(int nr, volatile unsigned long *addr)

头文件:#include

 10 static int __init test_init(void)
 11 {
 12
 13     volatile u32 i = 0xffffffff;
 14     volatile u32 j = 0x0;
 15
 16     clrsetbits_be32(&j, 0x8000a000, 0x40000f00);
 17     printk(" %x \n", j); // j: 0->4000 0f00
 18     clrsetbits_be32(&i, 0x8000a000, 0x40000f00);
 19     printk(" %x \n", i); // i: FFFF FFFF -> 7fff5fff
 20
 21     i = 0x0;
 22     setbits32(&i, 0xf020);
 23     printk(" %x \n", i); // i: 0 -> f020
 24     i = 0xffffffff;
 25     clrbits32(&i, 0xf020); // i: FFFF FFFF ->  ffff0fdf
 26     printk(" %x \n", i);
 27
 28     return 0;
 29 }

result:
 40000f00
 7fff5fff
 f020
 ffff0fdf

类似函数还有:
setbits16(_addr, _v)
clrbits16(_addr, _v)
 setbits8(_addr, _v)
 clrbits8(_addr, _v)
用法类似
阅读(1918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~