`

位运算应用口诀

 
阅读更多
位运算应用口诀
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
移位运算
要点 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;
        }

分享到:
评论

相关推荐

    位运算应用口诀,你知道掌握了多少?

    "位运算应用口诀" 位运算是一种基础的计算机操作,用于对二进制数进行操作。它可以用于判断奇偶数、取某数中指定位、清零取反、交换两个变量的值等多种场景。 1. 位运算符的应用 (1) 按位与 (&):用于清零特定位...

    单片机C51位运算应用技巧

    位运算应用口诀: 清零取位要用与,某位置一可用或,若要取反和交换,轻轻松松用异或! 移位运算要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。 2 "&lt;&lt;" 左移:右边空出的位上补0,左边...

    经典的位运算合集 Matrix67及总结

    【转载】常用位操作 位运算应用口诀 常用位操作 几个常用的位操作 计算树状数组lowbit的三种方法 统计一个整数的二进制中1的个数(位运算技巧) 收藏 统计一个整数的二进制中1的个数的三种方法 位运算讲稿_by_...

    位运算常用操作总结

    #### 二、位运算应用口诀 - 清零取反要用与 - 某位置一可用或 - 若要取反和交换,轻轻松松用异或 - 移位运算 - 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。 - 右移:右边的位被挤掉。对于...

    免费下载:C语言难点分析整理.doc

    位运算应用口诀和实例 这部分提供了一些位运算的实用示例和记忆技巧。 ### 35. 内存对齐与ANSI C中struct内存布局 这部分解释了内存对齐的概念以及在C语言中如何影响结构体的内存布局。 ### 36. 冒泡和选择排序...

    C语言难点分析整理

    34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆...

    数学运算口诀儿歌.doc

    这篇文档实际上是一系列关于基础数学运算的儿歌和记忆口诀,主要涵盖了小学阶段的数学基础知识,包括乘法、除法、小数运算、比较大小、混合运算、解应用题、四舍五入、鸡兔同笼问题以及时间、单位转换等方面。...

    高级C语言.PDF

    C语言中的位运算 ........................................................................................................................ 41 12. 浮点数的存储格式: .......................................

    九九乘法口诀表.pdf

    3. 再次,学生需要在实际运算中应用九九乘法口诀表,提高数学运算速度和准确性。 九九乘法口诀表在小学教育中的作用是不可替代的,它可以帮助学生建立数学基础,提高数学运算速度和准确性,ultimately帮助学生在...

    android算术口诀表

    在Android平台上,开发一款"算术口诀表"应用,主要目标是帮助用户尤其是孩子们学习和练习基础的数学运算,如加法、减法、乘法和除法。这款应用的特点在于其自动化播放功能,使得学习过程更加生动有趣。虽然在当前的...

    一年级数学应用题口诀(打印版).pdf

    在一年级数学应用题的口诀教学中,教学材料通常会设计一些口诀表格以帮助学生理解和掌握基本的数学概念和运算方法。从提供的文件内容来看,这份材料主要分为三个部分:应用题加法口诀表、应用题减法口诀表以及特殊...

    小学二年级九九乘法口诀表及口诀练习题-二年口诀表.doc

    在小学二年级,学生需要学习和熟悉九九乘法口诀表,以便更好地应用于数学运算。 九九乘法口诀表的主要内容包括: * 乘法口诀表的基本结构:九九乘法口诀表以表格形式呈现,每行代表一个乘法算式,例如:一二乘法...

    乘法口诀_C语言_C++_differents4l_

    3. **算法优化**:选择合适的算法,如使用位运算代替常规乘法,可以提高运算速度。 4. **编译器优化**:利用编译器提供的优化选项,如-O2或-O3,让编译器自动优化代码。 在`differents4l`这个标签下,可能暗示着对...

    (完整)四年级100道简便运算脱式计算.docx

    四年级数学运算律练习题解析 ...这份文件涵盖了四年级数学运算律的多个知识点,旨在帮助学生熟悉运算律、乘法口诀、加减法运算、括号运算、分数运算、单位换算、多步运算和数字推理等概念和规则。

    的乘法口诀及应用修改PPT学习教案.pptx

    综上所述,这个PPT学习教案以6的乘法口诀为主线,结合实际情境,通过多种教学活动,旨在全面培养学生对乘法运算的理解、记忆和应用能力,同时也强调了数学思维和问题解决技巧的培养,是一份全面而实用的教学资源。

    小学二年级乘法口诀练习题.doc

    本资源是小学二年级乘法口诀练习题,旨在帮助学生掌握乘法口诀和基本的数学运算技能。该资源包括四个部分,每个部分都包含多种类型的练习题目,涵盖乘法口诀、数学运算和逻辑思维等方面。 乘法口诀 乘法口诀是小学...

    的乘法口诀人教新课标二年级上册数学PPT课件.pptx

    总的来说,这个课件全面覆盖了二年级乘法口诀的学习要点,包括基础乘法运算、口诀的记忆与应用、实际问题的解决,以及简单的数学思维训练。通过丰富的教学形式和贴近生活的实例,帮助小学生建立起对乘法的深刻理解和...

    最新二年级数学上册第6单元表内乘法(二)第3课时8的乘法口诀课堂作业设计.pdf

    在这个阶段,教育的重点不仅在于记忆口诀,更在于理解口诀背后的数学规律,以及如何将这些知识应用到实际问题中。 8的乘法口诀通常包括以下内容: 1. 一八得八(1×8=8) 2. 二八十六(2×8=16) 3. 三八二十四(3...

Global site tag (gtag.js) - Google Analytics