判断整数的符号
-
int sign ( int x )
-
{
-
return (x>> 31 )| ( unsigned (-x ) )>> 31 ;
-
}
计算绝对值
-
int abs ( int x )
-
{
-
int y ;
-
y = x>> 31 ;
-
return (x^y )-y ; //or:(x+y)^y
-
}
一、先补充说明几个基础概念 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,实际上就是对该数求负,由于原来就是负数,因此就是变成正数。 综上所述,该过程就是求绝对值。
位计数
-
方法一:
-
int count ( long v )
-
{
-
int number = 0 ;
-
-
while (v )
-
{
-
v & = (v-1 ) ;
-
number++ ;
-
}
-
return number ;
-
}
-
-
方法二:
-
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 ;
-
}
-
#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位取反
方法一:
-
#define setbit(x,y) x|=(1<<y ) //将x的第y位置1
-
#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