`

[转]位运算的学习

阅读更多
作者:未知  (从别人转载的地方转载过来的)

我们都知道,数据在计算机里是以二进制形式表示的。在实际问题中,常常 也有一些数据对象的情况比较简单,只需要一个或几个二进制位就能够编码表示。如果在一个软件系统中这种数据对象非常多,用一个基本数据类型表示,对计算机 资源是一种浪费。另一方面,许多系统程序需要对二进制位表示的数据直接操作,例如许多计算机硬件设备的状态信息通常是用二进制位串形式表示的,如果要对硬 件设备进行操作,也要送出一个二进制位串的方式发出命令。由于C语言的主要设计目的是面向复杂的系统程序设计,所以它特别提供了对二进制位的操作功能,称 为位运算。

  位运算应用于整型数据,即把整型数据看成是固定的二进制序列,然后对这些二进制序列进行按位运算。与其它 高级语言相比,位运算是C语言的特点之一。但是由于位运算的应用涉及更深入和更广泛的内容,初学者不必细究,在实际应用中可逐步体会其优越性。这部分内容 相对比较独立,读者可根据实际需要选择学习。本书仅对位运算及其应用作简要的介绍。

3.5.1 位运算符

  因为一个二进制位只能取值为0或者1,所以位运算就是从具有0或者1值的运算对象出发,计算出具有0或者1 值的结果。C语言提供了6种基本位运算功能:位否定、位与、位或、位异或、位左移和位右移。其中除位否定是单目运算外,其余5种均为双目运算,6个位运算 符分为4个优先级别,参见表3-9。
表3-9 逻辑运算符
运算符 含义 运算对象个数 结合方向 优先级
~ 按位求反 单目运算符 自右向左 1
<< 按位左移 双目运算符 自左向右 2
>> 按位右移 双目运算符 自左向右 2
& 按位与 双目运算符 自左向右 3
| 按位或 双目运算符 自左向右 4
^ 按位异或 双目运算符 自左向右 5

说明:
① 位运算的优先级是:~→<<、>>→&→|→^。
② 位运算的运算对象只能是整型(int)或字符型(char)的数据。
③ 位运算是对运算量的每一个二进制位分别进行操作。

3.5.2 按位逻辑运算

  按位逻辑运算包括:位与、位或、位异或和位否定等四种运算。为了帮助读者理解,我们设a和b都是16位二进制整数,它们的值分别是:
        a: 1010,1001,0101,0111
        b: 0110,0000,1111,1011
    为了便于阅读,a和b中每4位用一个逗号分开。以下介绍对于a和b的位与、位或、位异或和位否定等按位逻辑运算。

  1.按位与运算 (&)
    按位与是对两个运算量相应的位进行逻辑与,"&"的运算规则与逻辑与"&&"相同。
    按位与表达式:c=a&b
        a: 1010,1001,0101,0111
      & b: 0110,0000,1111,1011
        c: 0010,0000,0101,0011

  2.按位或运算(|)
    按位或是对两个运算量相应的位进行逻辑或操作,其运算规则与逻辑或"||"相同。
    按位或表达式:c=a|b
        a: 1010,1001,0101,0111
      | b: 0110,0000,1111,1011
        c: 1110,1001,1111,1111

  3.按位异或运算(^)
    按位异或运算的规则是:两个运算量的相应位相同,则结果为0,相异则结果为1。
    即: 0^0=0 0^1=1 1^0=1 1^1=0
    按位异或表达式:c=a^b
        a: 1010,1001,0101,0111
      ^ b: 0110,0000,1111,1011
        c: 1100,1001,1010,1100
    可见,异或运算的含义是:两个相应位的值相异,则结果为1,相同则为0。

  4.按位求反运算符(~)
    按位求反运算运算规则是将二进制表示的运算对象按位取反,即将1变为0,将0变为1。
    按位异或表达式:c=~a
       ~ a: 1010,1001,0101,0111
         c: 0101,0110,1010,1000

  5.按位逻辑运算的应用
例3-8:设 int x=7,求y=~x
        y=~x=~7=~(0000,0000,0000,0111)=1111,1111,1111,1000=-8
    可见,对x的值(7)按位求反结果恰为-8的补码表示,其原因是计算机中有:
    整数求负=整数求补=按位求反+1 
    所以:按位求反=整数求负-1。
    请注意求反运算与单目减和逻辑非运算的区别:
     y=-x;  结果为:y=-7,
        y=!x; 结果为:y=0。

  例3-9:用按位与运算屏蔽特定位(将指定位清为0)。
    设 n=051652(八进制数),计算m=n&0177,则:m=052。
         n: 0,101,001,110,101,010
    & 0177: 0,000,000,001,111,111
         m: 0,000,000,000,101,010
    经过位与运算,将n前9位屏蔽掉,即截取n的后7位。

  例3-10:用按位与运算保留特定位。
    要想将一个变量n的特定位保留下来,只要设一个数,使该数的某些位为1,这些位是与要保留的n的特定位相对应的位,再将n与该数按位与。
    设 n=011050(为八进制数。对应的二进制为:0,001,001,000,101,000),要将n的右起第2、4、6、8、10位保留下来,只要 n=n&01252,则有:
           n: 0,001,001,000,101,000
     & 01252: 0,000,001,010,101,010
           n: 0,000,001,000,101,000 (n=01050)
    注意,按位与的"&"功能与取地址运算的"&"不同,尽管两者采用了相同的符号。

  例3-11:用按位或运算将指定的位置为1。
    设:x=061,y=016,则z=a|b为:
       x: 0000,0000,0011,0001
        | y: 0000,0000,0000,1110
          z: 0000,0000,0011,1111
    即将x或y中为1的位的相应位置成1,其结果是z中的后6位为1。

  例3-12:用按位异或运算将某个量的特定位翻转。
    要将变量n的特定位翻转,即原来为1的变0,为0的变1,只要设一个数,使该数的某些位为1,这些位是与n中要翻转的相对应的位,然后将n与该数进行按位异或运算。
    设:a=015,要将后四位翻转,只要a=a^017,则:
          a: 0000,0000,0011,1101
      ^ 017: 0000,0000,0011,1111
          a: 0000,0000,0000,0010

3.5.3 移位运算

  C语言提供了两个移位运算:左移和右移,它们是把整数作为二进制位序列,求出把这个序列左移若干位或者右移 若干位所得到的序列。左移和右移都是双目运算,运算符左边的运算对象是被左移或右移的数据,而运算符右边的运算对象是指明移动的位数。数据左移或右移后空 出来的位置补0。
左移、右移运算表达式的一般形式为:
x << n 或 x >> n
其中x为移位运算对象,是要被移位的量;n是要移动的位数。
左移运算的规则是将x的二进制位全部向左移动n位,将左边移出的高位舍弃,右边空出的位补0。右移是将x的各二进制位全部向右移动n位,将右边移出的低 位舍弃,左边高位空出要根据原来量符号位的情况进行补充,对无符号数则补0;对有符号数,若为正数则补0,若为负数则补1。

  例如,设a=7,则:
b=a<<2  即:b=0000,0111<<2=0001,1100=28
c=a>>2  即:c=0000,0111>>2=0000,0001=1
左移的一个特殊用途是将整数值乘以2的幂,例如:左移运算表达式1<<4的计算结果是16,右移可以用于将整数值除乘2的幂。

3.5.4 位运算赋值运算符

  位运算符与赋值运算符可以组成以下5种位运算赋值运算符:
&=、 |=、 >>=、 <<=、 ^=
由这些位运算赋值运算符可以构成位运算赋值表达式。例如:
x&=y 相当于:x=x&y
x<<=2 相当于:x=x<<2
x>>=3 相当于:x=x>>3
x^=5 相当于:x=x^5

分享到:
评论

相关推荐

    C++位运算与进制转换小工具,方便C、C++学习过程中对位的处理,方便观察十六进制地址的变化

    位运算相关功能: 1.位与运算 2.位或运算 3.位异或运算 4.非运算 5.左移运算 6.右移运算 二.进制转换: 1.十进制转二进制 2.二进制转十进制 3.二进制+ 4.二进制- 5.十进制转八进制 6.八进制转十进制 7.八进制+ 8.八...

    Kotlin基础学习之位运算

    什么是位运算? 程序中的所有数在计算机内存中都是以...由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。当然有人会说,这个快了有什么用,计算6 and 11没有什么实际意义啊。这一系列的文章

    C语言编程技术实践 位运算及运用翻转课堂教学设计.docx

    C语言编程技术实践 位运算及运用翻转课堂教学设计.docx 学习资料 复习资料 教学资源

    C语言编程技术实践2020版 实验位运算翻转课堂教学设计.docx

    C语言编程技术实践2020版 实验位运算翻转课堂教学设计.docx 学习资料 复习资料 教学资源

    lua中2进制位运算算法总结

    2进制lua中的一些简单算法,希望大家好好学习啊,很有用的

    《算法很美》python实现 (位运算)

    位运算符号:&(位与),|(位或),^(位异或) &:对应数位都是1,该位运算结果才为1 |:对应数位只要有1个为1,该位运算结果就为1 ^: 对应数位相同(同1 或 同0),该位运算结果为1 位运算基础运用: ① 判断奇偶数...

    计算机中的数制转换及加减运算教学设计.doc

    课题 《计算机中的数制转换及加减运算》 教材分析:在计算机内部采用的都是二进制,让学生理解什么是二进制及二... (3)位权大小为20、21、22...2n 4、二进制与十进制的相互转换 (1)、二进制转十进制——按权位展开

    JavaScript常用进制转换及位运算实例解析

    主要介绍了JavaScript常用进制转换及位运算实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    使用位运算、值交换等方式反转java字符串(四种方法)

    主要介绍了使用位运算、值交换等方式反转java字符串,本文通过四种方式给大家讲解,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    js中位运算的运用实例分析

    我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解。平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更高的。下面通过一些实例来...

    超多Java初学者学习实例集锦.rar

    超多Java初学者学习实例集锦,涉及到Java中算术运算符的使用、Java中位运算符的使用、break语句的使用、continue语句的使用、用do-while语句计算10的阶乘、用for语句计算10的阶乘、Java中逻辑运算符的使用、求三个数...

    Java2入门经典.rar

    译者序 序 前言 第一章:Java概述 什么是Java Java语言的特性 学习Java ava程序 学习Java要走的路 ...按位运算的方法 有固定序列整型值的变量(枚举) 布尔型变量 运算符的优先级 程序注释 本章小结 ……

    java2入门经典.part01

    java2入门经典.part01 Java2入门经典 图书目录 译者序 序 前言 第一章:Java概述 什么是Java ...按位运算的方法 有固定序列整型值的变量(枚举) 布尔型变量 运算符的优先级 程序注释 本章小结 ……

    labview学习资料-labview初级例程源码(76个).zip

    位运算.vi 元素比较与集合比较.vi 关系0运算.vi 关系运算.vi 判断空字符串.vi 判断空数组.vi 判断范围强制类型转换.vi 单选按钮.vi 基本信息.ctl 复合运算字符串加密.vi 复合运算符用法举例.vi 多态VI.vi 字符判断....

    华中科技大学计算机组成原理实验.zip

     利用logisim平台中现有运算部件构建一个32位运算器,可支持算数加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移,算术右移运算,支持常用程序状态标志(有符号溢出OF、无符号溢出CF,结果相等...

    单片机-进制-PPT.pptx

    学习目标 1、学习二进制、十进制、十六进制的特点、表示方式 2、学习二进制的状态表示 3、学习二进制、十六进制转换为十进制的方法 单片机-进制-PPT全文共63页,当前为第2页。 1、计算机的数制有哪些 2、十进制、二...

    汇编语言程序设计1

    主要功能: 包括基本的四则运算、括号运算、负数运算、并且扩展8086的16位上限功能。 2. 学习目的 (1) 综合运用所学的微机汇编语言程序设计的知识。 (2) 进一步巩固在PC上建立、汇编、链接、调试和运行汇编语言程序...

    C语言入门与提高_12764492.part2

    C语言入门与提高,陈锐主编,高清电子书 目录 第1篇 起步篇 第1章 C语言概述 1.1 为什么要学习C语言 1.1.1 学习C语言的好处 1.1.2 如何学好C语言 ...第13章 位运算 第14章 文件 第4篇 提高篇 第15章 链表 附录

    C语言入门与提高_12764492.part1

    C语言入门与提高,陈锐主编,高清电子书 目录 第1篇 起步篇 第1章 C语言概述 1.1 为什么要学习C语言 1.1.1 学习C语言的好处 ...第13章 位运算 第14章 文件 第4篇 提高篇 第15章 链表 附录

Global site tag (gtag.js) - Google Analytics