神奇的位运算

写这篇文章的主要目的就是一个不断积累的过程,

文中提到的方法其实平时很少用到,就当做是知识扩展吧

位运算中常见的一个操作 与& , 或| , 非~  异或 ^    左移位<<  又移位>>

定义我就不说了,记录几个用法直接上代码了

1,求两个数的平均值(有效防止溢出的位运算方法)

int ave(int a,int b)
{
    reutrn (a&b) + ((a^b)>>1)
}

解释下,(a&b)表示a,b二进制中都为1的部分(既然是公共的部分就不需要除以2),a^b 的结果是把余下的 a,b中仅有一个对应位为1的相加的结果

(由于不是共有的当然要除以2了) >>1就是除以2

2,不用临时变量交换两个整数的值

int change(int a,int b)
{
     a^=b;
     b^=a;
     a^=b;
}

补充下,我只是说下这个用法,不要较真说我没用指针根本就无法交换就好。

3,求一个整数的绝对值

int abs(int a)
{
    int i=a>>31;
    return  (a^i ) -i;
}

解释下,这里int 是32位整数, a>>31 的结果分两种情况,如果a>=0  那么右移31位答案一定是零,

如果a是负数 那么右移31位的补符号位,结果是-1,二进制表示就是全为1. 而一个数与-1 异或的结果就是对其取反(异或定义)

所以(a^i) - i  的结果就是 取反加一,你懂的。

4,如果判断一个自然数是不是2的整数幂

int chk(int a)
{
    return (a&(a-1)==0) &&(a!=0)
}

这个很好理解,由此启发我们可以得到一个判断一个整数2进制表示里面1的个数的方法

int num1(int a)
{
    int ans=0;
    while(a)
   {
        a&=a-1;
       ans++;
   }
   return ans;
}

以后再补充。。。

神奇的位运算,布布扣,bubuko.com

时间: 2024-12-25 00:15:56

神奇的位运算的相关文章

Java中的二进制及基本的位运算

Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神

c语言位运算详解

位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. C语言提供的位运算符列表: 运算符含义描述 & 按位与      如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或      两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或    若参加运算的两个二进制位值相同则为0,否则为1 ~ 取反        ~

位运算 使用技巧

位运算简介及实用技巧(一):基础篇 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算.举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110 AND 1011 ---------- 0010  -->  2 由于位运算

浅谈位运算

位运算算是从汇编语言一代传下来的老东西了,只有寥寥6个运算符.乍一看,你会说它没什么用处,那么你只对了一半:站在现在的高级编程角度来讲,确实用处不大:但是在涉及硬件底层的编程(如驱动程序,嵌入式开发)里,需要很强的操纵硬件能力,这时,就常常涉及到位运算. 位运算有6个运算符,它们分别是:&(与).|(或).^(异或).~(取反).>>(右移).<<(左移).其含义如下表所示: 运算符 含义 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 &g

C/C++中的位运算

位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或).^(按位异或).~ (按位取反). 其中,按位取反运算符是单目运算符,其余均为双目运算符.     位运算符的优先级从高到低,依次为~.&.^.|, 其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.    (1)按位与运算符(&)

位运算讲解(剪辑)

位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. C语言提供的位运算符列表: 运算符 含义 描述 & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1 ~ 取反 ~是一元运算符,用来对一个二进制数按

位运算简介及实用技巧(二):进阶篇(1)[转]

位运算简介及实用技巧(二):进阶篇(1) 原贴链接:http://www.matrix67.com/blog/archives/264 =====   真正强的东西来了!   ===== 二进制中的1有奇数个还是偶数个    我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1.例如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1.var   i,x,

位运算的另一种姿势

在蒟蒻Cydiater日常水题的过程中,忽然遇到了一道题.中间有一个过程是要求在很快的时间内求出$1500$大小的两个01串的与之后存在多少个1. 最坏的,扫一遍,整体复杂度$O(N)$,好像没有什么可以优化的空间了QAQ.我开始考虑用位运算的与操作优化,因为其有$1500$个元素,所以可以考虑把这个东西拆成$\frac{N}{32}$个01串. 但是这之后好像就又存在一个问题.如何快速的统计一个二进制的01串里有多少个1?如果不要求$O(1)$,可以不停的统计lowbit,那么这个复杂度就和有

C语言位运算详解(转载)

转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型.C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结