你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【肚肚分享】巧用c语言位运算

[复制链接]
拉肚肚 发布时间:2015-9-4 11:14
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑

我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。
(1) 判断int型变量a是奇数还是偶数           
  a&1   = 0 偶数
  a&1   = 1 奇数
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 将int型变量a的第k位清0,即a=a&~(1<<k)
(4) 将int型变量a的第k位置1, 即a=a|(1<<k)
(5) int型变量循环左移k次,即a=a<<k|a>>16-k   (设sizeof(int)=16)
(6) int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(int)=16)
(7)整数的平均值
    对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y)   //返回X,Y 的平均值
{   
     return (x&y)+((x^y)>>1);
}
(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
boolean power2(int x)
{
    return ((x&(x-1))==0)&&(x!=0);
}
(9)不用temp交换两个整数
void swap(int x , int y)
{
    x ^= y;
    y ^= x;
    x ^= y;
}
(10)计算绝对值
int abs( int x )
{
  int y ;
  y = x >> 31 ;
  return (x^y)-y ;        //or: (x+y)^y
}
(11)取模运算转化成位运算 (在不产生溢出的情况下)
      a % (2^n) 等价于 a & (2^n - 1)
(12)乘法运算转化成位运算 (在不产生溢出的情况下)
      a * (2^n) 等价于 a<< n
(13)除法运算转化成位运算 (在不产生溢出的情况下)
      a / (2^n) 等价于 a>> n
      例: 12/8 == 12>>3
(14) a % 2 等价于 a & 1      
(15) if (x == a) x= b;
   else x= a; 等价于 x= a ^ b ^ x;
(16) x 的 相反数 表示为 (~x+1)




//设置x的第y位为1
#define setbit(x,y) (x)|=(1<<(y-1))
//得到x的第y位的值
#define BitGet(Number,pos) ((Number)>>(pos-1)&1)
//打印x的值
#define print(x) printf("%dn",x)
//将整数(4个字节)循环右移动k位
#define Rot(a,k) ((a)<<(k)|(a)>>(32-k))
//判断a是否为2的幂次数
#define POW2(a) ((((a)&(a-1))==0)&&(a!=0))
#define OPPX(x) (~(x)+1)
//返回X,Y 的平均值
int average(int x, int y)
{   
    return (x&y)+((x^y)>>1);
}
//判断a是否为2的幂次数
bool power2(int x)
{
    return ((x&(x-1))==0)&&(x!=0);
}
//x与y互换
void swap(int& x , int& y)
{
     x ^= y;
     y ^= x;
     x ^= y;
}
收藏 6 评论16 发布时间:2015-9-4 11:14

举报

16个回答
creep 回答时间:2015-9-4 11:25:45
感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。
mark0668 回答时间:2015-9-4 11:33:50
感谢分享
拉肚肚 回答时间:2015-9-4 11:36:10
creep 发表于 2015-9-4 11:25
感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。

已经修改
你好我好大家好! 回答时间:2015-9-4 12:32:09
不错不错
JackieLaura 回答时间:2015-9-4 15:47:29
又看到你了
stmcu.org.png
JackieLaura 回答时间:2015-9-4 15:48:19
而且还是同一个帖子
stmcu.org.png
风子 回答时间:2015-9-4 16:05:37
呵呵,谢谢分享
alisa123 回答时间:2015-9-4 19:04:55
谢谢楼主分享!
拉肚肚 回答时间:2015-9-4 19:08:58
JackieLaura 发表于 2015-9-4 15:48
而且还是同一个帖子

哈哈 那么关注我
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版