`
garfieldcatcat
  • 浏览: 6488 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

位运算

阅读更多
位运算符C语言提供了六种位运算符:
    &          按位与
    |          按位或
    ^          按位异或
    ~          取反
    <<         左移
    >>         右移

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
(1) 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 ,保留低八位,可作a&255运算( 255 的二进制数为0000000011111111)。
(2) 一个数"&"1的结果就是取二进制的最末位,这可以用来判断一个整数的奇偶。


按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
(1) 按位或运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1
(2) 如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。
(1) 0^0=0,0^1=1  0异或任何数=任何数
(2) 1^0=1,1^1=0  1异或任何数-任何数取反
(3) x=x^x        任何数异或自己=把自己置0
(4) 使某些特定的位翻转
    例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
  10100001^00000110 = 10100111
(5) 实现两个值的交换,而不必使用临时变量。
    a = a^b;b = b^a; a = a^b;
(6) 在汇编语言中经常用于将变量置零:
    xor   a,a
(7) 快速判断两个值是否相等
    判断两个整数a,b是否相等,则可通过下列语句实现:
    return ((a ^ b) == 0)
(8) xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。
(9) int Func3(int data)//统计data中1的个数
    {
//利用了data&(data-1)每次都能移除最右边的1,移除了多少个1,就是包含了几个1
int count = 0;
while (data)
{
data = data & (data-1);
count++;
}
return count;
    }

求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。
如果求反的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差,unsigned short a=100;    a = ~a; a= 65435

左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics