黑马程序员技术交流社区

标题: 分享心得:位运算的几个用途 [打印本页]

作者: xiedongjiao    时间: 2015-3-20 17:21
标题: 分享心得:位运算的几个用途
在C语言中,位运算是比乘除取余运算快的,如果为了提高代码运行速度,我们可以用位运算来代替乘除取余运算的。
以下是例子:
(123/4) == (123>>2);
(123*8) == (123<<3);
(123%32) == (123-(123>>4<<4));

如果我们进入一个函数时,需要判断一个static的变量的值,如果是0,我们需要赋值为1,如果是1,我们需要赋值为0。
下面是很多人会用的方法:
void fun(void)
{
        static int a = 1;
        if(a)  a = 0;
        else a = 1;
}
其实如果用位运算的话,我们只需要一行代码即可搞定
void fun(void)
{
        static int a = 1;
        a ^= 1;
}
可能我们一行代码的精简不会对我们的程序起多大的作用,但是写程序就该从精简与高效着手。
暂时先写到这。。。吃饭去:time:



作者: xiaoxiong    时间: 2015-3-20 17:42
刚看了这点的视频,楼主总结的不错
作者: 一步一个脚印    时间: 2015-3-20 17:58
亲  你知道的 ,关于移位,也不是随便都能用的。如果是左移,那ok,如果是右移呢,那就得考虑负值,可以逻辑右移就只添冲o,可以算术右移,那就会添从符号为1.当然正值但情况下,左移和右移是一样的。
作者: xiedongjiao    时间: 2015-3-23 10:13
我们继续位运算的用途。。。
代码中经常用到两个变量的数值交换,一般交换核心代码如下:
void fun(int *a, int *b)
{
      int temp;
      temp = *a;
      *a = *b;
      *b = temp;
}
如果我们用位运算其实可以不用多定义temp这个变量,代码如下:
void fun (int *a, int *b)
{
      *a = *a ^ *b;
      *b = *a ^ *b;
      *a = *a ^ *b;
}
我第一次看到这个方法的时候感觉位运算好神奇,让我对位运算有种情有独钟。。。

作者: xiedongjiao    时间: 2015-3-23 11:03
位运算还可以帮我们判断整形变量的奇偶,
void fun(int a)
{
     if(a&1)
          printf("偶数\n");
     else
          printf("奇数\n");
}
我们就不讨论按位与的“清零”,以及按位或的“置1”,不过我感觉有个求平均值的操作很有意思,
如果我们要求两个无符号整形的平均值
unsigned int x = 0xffff0000, y = 0xffff2222;//答案显而易见,平均值为0xffff1111
但是我们用代码实现时,不能用(x+y)/2来做,因为(x+y)溢出了,但是,我们有位运算!
unsigned int fun(unsigned int x, unsigned int y)
{
    return (x&y)+((x^y)>>1);
}

作者: xiedongjiao    时间: 2015-3-23 11:35
xiaoxiong 发表于 2015-3-20 17:42
刚看了这点的视频,楼主总结的不错

赶紧凑够10个技术分,发blog了!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2