作者:未知 (从别人转载的地方转载过来的)
我们都知道,数据在计算机里是以二进制形式表示的。在实际问题中,常常 也有一些数据对象的情况比较简单,只需要一个或几个二进制位就能够编码表示。如果在一个软件系统中这种数据对象非常多,用一个基本数据类型表示,对计算机 资源是一种浪费。另一方面,许多系统程序需要对二进制位表示的数据直接操作,例如许多计算机硬件设备的状态信息通常是用二进制位串形式表示的,如果要对硬 件设备进行操作,也要送出一个二进制位串的方式发出命令。由于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语言中运用位运算来实现数据处理与转换的基本方法。位运算是指直接对二进制位进行操作的运算方式,在计算机科学中...
### Java中的位运算 #### 一、概述 位运算(Bitwise Operators)是计算机科学中的一个基础概念,它直接作用于二进制位上。在Java语言中,位运算符可以应用于所有整型数据类型,如`long`、`int`、`short`、`char`和...
然而,在现有的C和C++教材中,对于位运算的介绍相对简略,导致许多学习者只知道位运算符的存在,却不知道如何在实际编程中加以运用。 #### 二、位运算符详解 C和C++提供了多种位运算符,包括按位与`&`、按位或`|`...
在编程领域,位运算是一种底层且高效的计算方式,它直接操作二进制位进行运算。在易语言中,我们可以利用位运算来实现加法运算,这通常涉及到位移、按...学习和掌握位运算技巧,能够帮助你编写出更加高效和优化的程序。
学习并熟练掌握这些位运算技巧,不仅能够提升编程效率,也能在笔试面试中展现出深厚的基础和解决问题的能力。通过实践和不断探索,你会发现位运算在解决某些特定问题时,有着独特的优势和魅力。
位运算在计算机科学中扮演着至关重要的角色,尤其是在低级编程和硬件交互中。"一参多义"这个概念在位运算中体现为一个...在阅读和分析压缩包中的"位运算例程"时,可以进一步学习这些操作的实际运用场景和具体实现细节。
“位运算(全)”这个文件可能包含了关于位运算的各种实例和练习,可以帮助学习者深入理解和熟练掌握这些概念。通过实践这些运算,你可以更好地理解它们如何影响二进制数字,从而在编程中运用得更加自如。同时,进制...
位运算在计算机科学中扮演着至关重要的角色,尤其是在低级别的编程和系统级操作中。C语言提供了丰富的位运算符...因此,理解并能灵活运用位运算对于任何想深入学习计算机底层原理的IT专业人士来说都是必不可少的技能。
【C语言程序设计提高篇位运算】是编程学习中的一个重要环节,主要涉及到计算机底层操作,尤其是在处理硬件控制和高效算法时。位运算涉及到对数据的二进制位进行操作,这是计算机内部处理数据的基本方式。在C语言中,...
位运算在计算机科学中扮演着重要的角色,尤其是在底层数据处理和高效的编程中。位运算符是C++等高级语言中用于直接操作数据的二...学习和掌握位运算,不仅可以提升编程能力,也有助于深入理解计算机内部的运算机制。
C语言位运算PPT课件 C语言位运算是编程语言中的一种重要操作,通过位运算符可以对二进制数进行操作,达到不同的目的。本PPT课件详细讲解了C语言中的位运算符,包括按位与、按位或、按位异或、按位求反、左移和右...
位运算在计算机科学中扮演着重要的角色,尤其是在底层数据处理和高效的编程中。位运算符主要有按位与(&),按位或(|),按位异或(^),按位异求反(~)以及位移运算符(和>>),这些运算符在C/C++等编程语言中常见。 1. ...
位运算在计算机科学中扮演着重要的角色,尤其是在底层编程和高效计算中。这些运算符针对整型数据(包括字符型)进行操作,因为它们是基于二进制位的。位运算速度非常快,效率高,而且能有效地节省存储空间。在进行位...
C语言中的位运算是一种在计算机科学中非常基础且重要的概念,尤其对于低级别的程序设计和硬件交互至关重要。位运算直接作用于二进制位,它允许我们对内存中的每个比特位进行操作,这对于理解计算机底层工作原理以及...
位运算在计算机科学中扮演着重要的角色,尤其是在底层编程、数据处理和算法设计中。"异或"(XOR)是位运算的一种,它在逻辑上等同于"不相同",即当两个输入位不同时,结果为1;而当两个输入位相同时,结果为0。本篇...