【转】看完这个你的位运算学得就差不多了

位运算应用口诀

清零取反要用与,某位置一可用或 
若要取反和交换,轻轻松松用异或 
移位运算 
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。 
    2 " < <" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。 
    3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。 
    4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。 
位运算符的应用 (源操作数s 掩码mask) 
(1) 按位与-- & 
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask) 
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask) 
(2) 按位或-- ¦ 
    常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s ¦mask) 
(3) 位异或-- ^ 
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask) 
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1) 
    目 标          操 作              操作后状态 
a=a1^b1        a=a^b              a=a1^b1,b=b1 
b=a1^b1^b1      b=a^b              a=a1^b1,b=a1 
a=b1^a1^a1      a=a^b              a=b1,b=a1 
二进制补码运算公式: 
-x = ~x 1 = ~(x-1) 
~x = -x-1 
-(~x) = x 1 
~(-x) = x-1 
x y = x - ~y - 1 = (x ¦y) (x&y) 
x-y = x ~y 1 = (x ¦~y)-(~x&y) 
x^y = (x ¦y)-(x&y) 
x ¦y = (x&~y) y 
x&y = (~x ¦y)-~x 
x==y:    ~(x-y ¦y-x) 
x!=y:    x-y ¦y-x 
x < y:    (x-y)^((x^y)&((x-y)^x)) 
x <=y:    (x ¦~y)&((x^y) ¦~(y-x)) 
x < y:    (~x&y) ¦((~x ¦y)&(x-y))//无符号x,y比较 
x <=y:    (~x ¦y)&((x^y) ¦~(y-x))//无符号x,y比较 
应用举例 
(1) 判断int型变量a是奇数还是偶数            
a&1  = 0 偶数 
      a&1 =  1 奇数 
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 
(3) 将int型变量a的第k位清0,即a=a&~(1 < <k) 
(4) 将int型变量a的第k位置1, 即a=a ¦(1 < <k) 
(5) int型变量循环左移k次,即a=a < <k ¦a>>16-k  (设sizeof(int)=16) 
(6) int型变量a循环右移k次,即a=a>>k ¦a < <16-k  (设sizeof(int)=16) 
(7)整数的平均值 
对于两个整数x,y,如果用 (x y)/2 求平均值,会产生溢出,因为 x y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法: 
int average(int x, int y)  //返回X,Y 的平均值 
{    
    return (x&y) ((x^y)>>1); 

(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 
boolean power2(int x) 

    return ((x&(x-1))==0)&&(x!=0); 

(9)不用temp交换两个整数 
void swap(int x , int y) 

    x ^= y; 
    y ^= x; 
    x ^= y; 

(10)计算绝对值 
int abs( int x ) 

int y ; 
y = x >> 31 ; 
return (x^y)-y ;        //or: (x y)^y 

(11)取模运算转化成位运算 (在不产生溢出的情况下) 
        a % (2^n) 等价于 a & (2^n - 1) 
(12)乘法运算转化成位运算 (在不产生溢出的情况下) 
        a * (2^n) 等价于 a < < n 
(13)除法运算转化成位运算 (在不产生溢出的情况下) 
        a / (2^n) 等价于 a>> n 
        例: 12/8 == 12>>3 
(14) a % 2 等价于 a & 1        
(15) if (x == a) x= b; 
            else x= a; 
        等价于 x= a ^ b ^ x; 
(16) x 的 相反数 表示为 (~x 1)

实例

功能              ¦          示例            ¦    位运算 
---------------------- --------------------------- -------------------- 
去掉最后一位          ¦ (101101->10110)          ¦ x >> 1 
在最后加一个0        ¦ (101101->1011010)        ¦ x < < 1 
在最后加一个1        ¦ (101101->1011011)        ¦ x < < 1 1 
把最后一位变成1      ¦ (101100->101101)          ¦ x ¦ 1 
把最后一位变成0      ¦ (101101->101100)          ¦ x ¦ 1-1 
最后一位取反          ¦ (101101->101100)          ¦ x ^ 1 
把右数第k位变成1      ¦ (101001->101101,k=3)      ¦ x ¦ (1 < < (k-1)) 
把右数第k位变成0      ¦ (101101->101001,k=3)      ¦ x & ~ (1 < < (k-1)) 
右数第k位取反        ¦ (101001->101101,k=3)      ¦ x ^ (1 < < (k-1)) 
取末三位              ¦ (1101101->101)            ¦ x & 7 
取末k位              ¦ (1101101->1101,k=5)      ¦ x & ((1 < < k)-1)

取右数第k位          ¦ (1101101->1,k=4)          ¦ x >> (k-1) & 1

把末k位变成1          ¦ (101001->101111,k=4)      ¦ x ¦ (1 < < k-1) 
末k位取反            ¦ (101001->100110,k=4)      ¦ x ^ (1 < < k-1) 
把右边连续的1变成0    ¦ (100101111->100100000)    ¦ x & (x 1) 
把右起第一个0变成1    ¦ (100101111->100111111)    ¦ x ¦ (x 1) 
把右边连续的0变成1    ¦ (11011000->11011111)      ¦ x ¦ (x-1) 
取右边连续的1        ¦ (100101111->1111)        ¦ (x ^ (x 1)) >> 1 
去掉右起第一个1的左边 ¦ (100101000->1000)        ¦ x & (x ^ (x-1)) 
判断奇数      (x&1)==1 
判断偶数 (x&1)==0

例如求从x位(高)到y位(低)间共有多少个1

public static int FindChessNum(int x, int y, ushort k) 

            int re = 0; 
            for (int i = y; i <= x; i ) 
            { 
                re = ((k >> (i - 1)) & 1); 
            } 
            return re; 
}

时间: 2024-08-10 02:48:39

【转】看完这个你的位运算学得就差不多了的相关文章

POJ 2777 Count Color(位运算+线段树+lazy+区间更新)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39905   Accepted: 12034 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

Java 位运算超全面总结

1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动简洁的解释:对原码.反码.补码最通俗易懂,生动简洁的解释,墙裂建议大家先看完这篇科普文章.在继续讨论之前你要先明白一点:整数在计算机内部都是以补码形式存储的. 2.Java 位运算概览 OK 都看到这儿了那我就假定你已经掌握了原码.反码.补码相关知识(虽然上面那段几乎啥也没讲,纯凑字数) 不废话了.

如果是初学C语言请看完 一些成功人士的心得

转自程先的专栏     今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了所有的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的1和0进行编码的:是他们发现了我们可以利用一个预先编写好的程序控制机器,并使之完成我们期望它完成的动作.建议大家在心里默念三遍他们的名字,以示仰慕.当然,如果让你们带着现在的知识回到他们的那个时代,那么就没有什么图灵奖了. C语言程序设计是我们的专业基础课,但是C语言本身却是

看完就改密码!但我打赌你肯定看不完

泡泡网新闻频道5月30日 今天小编在煎蛋网发现一篇长文,用玩家的话说“我……从来没有在煎蛋上见到那么长的东西……除了边栏广告……”,这篇文章题目<用户密码薄如纸>,看过之 后你会相信现世界上部分黑客猜密码的时候都会试试“对马电池订书钉(correcthorsebatterystaple)”.详情请誊出40分钟看下 文. Password:对马电池订书钉(correcthorsebatterystaple) 前情提要:可能各位煎蛋蛋友看了题图和这句话后,会有点懵.其实“对马电池订书钉”出自XFC

位运算之——按位与(&amp;)操作——(快速取模算法)

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为1. 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 10101100000000 对10101100000000进行右移8位得到的是101011,这就得

位运算 使用技巧

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

看完这些,你就算得上既了解围棋又了解alphago了

首先,我们要祝贺小李下出第78手的“神之一手”,这一手堪称前无古人后无来者,尤其是结合了阿尔法狗自暴自弃的表现.小李说过他的失败并不是人类的失败,同样,小李的胜利也只是属于他一人的胜利. 然而人类在围棋领域会不会最终被机器所击败这一问题,在旧摩尔定律失效的情况下还不应急着下定论,看完这篇文章后有助于形成你自己的观点. 首先我们看到这张图.有人一定会觉得奇怪了:为什么左边的是英国国旗呢?Google难道不是美国的公司吗? 原因很简单,alphago是英国的deepmind公司研发的.2014年1月

[翻译]位运算暗黑魔导书

原文地址:http://graphics.stanford.edu/~seander/bithacks.html 有本书叫hack's delight也是主讲位运算的. 下面正文开始翻译吧,不定时更新. 声明: 如无特殊说明,所有的代码段都是不受版权限制的,如果喜欢,大家可以随便使用.文章内容由Sean Eron Anderson收集整理于1997-2005年.位运算的相关代码.说明以及分类希望能够给大家带来帮助,但是不对于该内容是否适合特定用途提供任何担保(or授权?).截止2005年5月5日

位运算及其应用实例(1)

摘要 位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算.本篇先简要介绍基本的位运算操作符及其用法(何时使用),然后介绍位运算符的几个典型应用: (1)      三种不用临时变量交换两个整数的实例,并分析每个实例的优缺点 (2)      进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用的,用于将十进制按照2的n次方进制输出的程序. (3)      给出利用位运算实现的计算整数的二进制表示中有多少个1