C语言中的位操作

判断整数的符号

普通浏览 复制代码
  1. int sign ( int x )
  2. {
  3.      return  (x>> 31 )| ( unsigned (-x ) )>> 31 ;
  4. }
.

计算绝对值

普通浏览 复制代码
  1. int  abs ( int x )
  2. {
  3.      int y ;
  4.     y  = x>> 31 ;
  5.      return  (x^y )-y ;  //or:(x+y)^y
  6. }

一、先补充说明几个基础概念 1、现有的微机基本上都是32位操作系统,在此操作系统中,整数为32位; 2、右移运算为按位往右移的操作,右移1位时最右边的位被丢弃,最高位保持原值不变,其他位都被其左边一位所替换,32位的整数右移31位,即是保留其最高位符号位,即正数得0,负数得-1。如:整数7,其二进制为:0000 0000 0000 0111,右移1位则为:0000 0000 0000 0011,得值为3; 3、关于负数的二进制表示,计算机中负数存储时,不是简单的将符号位置为1,而是采用补码的形式存储的:负数最高位为符号位,也就是1,其余全部取反,然后再加1。 如-7的二进制存储不是:1000 0000 0000 0111,而是:1111 1111 1111 1000+1即1111 1111 1111 1001 4、异或运算^,即两个数按位进行异或,当两个数中相同位相同时结果值对应位为0,否则为1,如3^7,表示为:0011 ^ 0111,则异或后值为:0100 等于4 二、有了以上基础概念,我们再来分析你的程序 针对以上代码分析如下: 1、 y = x > > 31 ;//右移31位,只保留符号位,如果是负数,则是-1,其二进制为1111 1111 1111 1111,全为1,如果是正数,则全0 2、x^y//X与Y的异或运算,按位进行异或,当y=0时,实际上二者异或后运算的值保持不变,当Y=-1时,则实际上是将原值每位求反(1变成0,0变成1) 3、-y//当y为0时保持不变,为-1时,则表示加1,因此 (x^y)-y当Y=0时,表示保持x不变,当y=-1时,则表示将x各位求反后加1,实际上就是对该数求负,由于原来就是负数,因此就是变成正数。 综上所述,该过程就是求绝对值。

位计数

普通浏览 复制代码
  1. 方法一:
  2. int count ( long v )
  3. {
  4.      int number  =  0 ;
  5.  
  6.      while (v )
  7.     {
  8.         v & =  (v-1 ) ;
  9.         number++ ;
  10.     }
  11.      return number ;
  12. }
  13. 方法二:
  14. int count ( unsigned x )
  15. {
  16.     x  = x- ( (x>> 1 ) &0x55555555 )  ;
  17.     x  =  (x &0x33333333 )+ (x>> 2 ) &0x33333333 ) ;
  18.     x  =  (x+ (x>> 4 ) ) &0x0f0f0f0f ;
  19.     x  = x+ (x>> 8 ) ;
  20.     x  = x+ (x>> 16 ) ;
  21.      return x &0x0000003f ;
  22. }
1.获取某位的值
普通浏览 复制代码
  1. #define BitGet(Number,pos) ((Number)|= 1<< (pos ) )  //把某位置1
  2. #define BitGet(Number,pos) ((Number) &= ~(1<< (pos ) )  //把某位置0
  3. #define BitGet(Number,pos) ((Number) >> (pos)&1)) //用宏得到某数的某位
  4. #define BitGet(Number,pos) ((Number) ^= 1<< (pos ) )  //把Number的POS位取反
2.设定某位的值(设为0或1)
方法一:
普通浏览 复制代码
  1. #define setbit(x,y) x|=(1<<y )  //将x的第y位置1
  2. #define clrbit(x,y) x&=~(1<<y )  //将x的第y位清0
方法二: 
置0,用0去‘与’
int a|=(1<<x) // x就是某位需要置1的数字,如第四位置1为: a|=(1<<4)
置1,用1去‘或’ 
int a&=~(1<<x) //把某位置0
来自: http://www.vcan123.com/forum.php?mod=viewthread&tid=125

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值