OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2807|回复: 14

位操作的艺术

[复制链接]

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
发表于 2016-9-21 10:40:53 | 显示全部楼层 |阅读模式
C语言——位操作
【更多分享:http://blog.csdn.net/wqx521


一、基本位操作
|
&
~
取反
^
异或
<<
左移
>>
右移

二、位操作的常见用法
1.获取某位的值
[mw_shl_code=c,true]#define BitGet(Number,pos)  ((Number)|= 1<<(pos))   //把某位置1
#define  BitGet(Number,pos)   ((Number) &= ~(1<<(pos)) //把某位置0
#define  BitGet(Number,pos)   ((Number) >> (pos)&1)) //用宏得到某数的某位
#define  BitGet(Number,pos)   ((Number) ^= 1<<(pos)) //把Number的POS位取反[/mw_shl_code]
2.设定某位的值(设为0或1) --- 实际应用中用的比较多的
方法一:
[mw_shl_code=c,true]#define setbit(x,y)  x|=(1<<y)   //将x的第y位置1
#define clrbit(x,y)  x&=~(1<<y) //将x的第y位清0[/mw_shl_code]
方法二:
置0,用0去‘与’;置1,用1去‘或’
[mw_shl_code=c,true]int a|=(1<<i)
int a&=~(1<<i)[/mw_shl_code]
3.循环移位
[mw_shl_code=c,true]#define ROTATE_LEFT(x, n)  ((x) << (n)) | ((x) >> ((8 * sizeof(x)) - (n)))
#define ROTATE_RIGHT(x, n)  ((x) >> (n)) | ((x) << ((8 * sizeof(x)) - (n)))[/mw_shl_code]
4.计算绝对值
[mw_shl_code=c,true]int abs(int x)
{
    int y;
    y = x>>31;
    return (x^y)-y; //orx+y)^y
}[/mw_shl_code]
5.判断整数的符号
[mw_shl_code=c,true]int sign(int x)
{
    return (x>>31)|(unsigned(-x))>>31;
}[/mw_shl_code]
6.两个数比较
[mw_shl_code=c,true]  x==y: ~(x-y|y-x)
  x!=y: x-y|y-x
  x
  x<=y: (x|~y)&((x^y)|~(y-x))
  x
  x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较[/mw_shl_code]
7.交换两个数的值(swap) ---小心越界
[mw_shl_code=c,true]1.x^= y ; y ^= x ; x ^= y ;
2.x= x+y ; y = x-y ; x = x-y ;
3.x= x-y ; y = y+x ; x = y-x ;
4.x= y-x ; x = y-x ; x = x+y ;[/mw_shl_code]
8.位计数
方法一:[mw_shl_code=c,true]int count(long v)
{
    int number = 0;

    while(v)
    {
        v &= (v-1);
        number++;
    }
    return number;
}[/mw_shl_code]
方法二:
[mw_shl_code=c,true]int count(unsigned x)
{
    x = x-((x>>1)&0x55555555) ;
    x = (x&0x33333333)+(x>>2)&0x33333333);
    x = (x+(x>>4))&0x0f0f0f0f;
    x = x+(x>>8);
    x = x+(x>>16);
    return x&0x0000003f;
}[/mw_shl_code]
9.二进制和GRAY码的转换
(1).二进制码到GRAY码的转换:
[mw_shl_code=c,true]unsigned B2G(unsigned B )
{
    return B^ (B>>1) ;
}[/mw_shl_code]
(2).GRAY码到二进制码:
[mw_shl_code=c,true]unsigned G2B(unsigned G)
{
    unsigned B ;

    B = G^ (G>>1) ;
    B = G^ (G>>2) ;
    B = G^ (G>>4) ;
    B = G^ (G>>8) ;
    B = G^ (G>>16) ;

    return B ;
  }[/mw_shl_code]

10.位反转
[mw_shl_code=c,true]unsigned rev(unsigned x)
{
    x = (x & 0x55555555) << 1 | (x>>1) & 0x55555555;
    x = (x & 0x33333333) << 2 | (x>>2) & 0x33333333;
    x = (x & 0x0f0f0f0f) << 4 | (x>>4) & 0x0f0f0f0f;
    x = (x<<24) | ((x&0xff00)<<8) | ((x>>8) & 0xff00) | (x>>24) ;
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-9-21 11:07:49 | 显示全部楼层
不错,多谢分享,很适合初学STM32的初学者学习。STM32里面有很多位操作
回复 支持 反对

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-21 12:18:49 | 显示全部楼层
zuozhongkai 发表于 2016-9-21 11:07
不错,多谢分享,很适合初学STM32的初学者学习。STM32里面有很多位操作

哈哈。帖子一发就要沉了。哈哈、
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-9-21 12:26:28 | 显示全部楼层
不错不错。……。…………。
回复 支持 反对

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-21 12:30:39 | 显示全部楼层
d1z1y2 发表于 2016-9-21 12:26
不错不错。……。…………。

回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2016-8-30
在线时间
21 小时
发表于 2016-9-21 14:18:50 | 显示全部楼层
实用贴!
回复 支持 反对

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-21 15:30:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2016-9-21 22:23:49 | 显示全部楼层
谢谢分享!!
把复杂的事,做简单!
回复 支持 反对

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-22 09:01:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2015-10-5
在线时间
27 小时
发表于 2016-9-22 09:42:40 | 显示全部楼层
赞,谢谢楼主
回复 支持 反对

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-22 09:44:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

125

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2728
注册时间
2015-10-29
在线时间
428 小时
发表于 2016-9-22 09:59:41 | 显示全部楼层
谢谢楼主!
回复 支持 反对

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-22 10:25:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2018-2-28
在线时间
86 小时
发表于 2018-6-5 15:46:26 | 显示全部楼层
多谢楼主分享
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-6-5 22:12:08 | 显示全部楼层
赞,谢谢楼主的分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 13:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表