位运算是指按二进制进行的运算在系统软件中,常常需要处理二进制位的问题C语言提供了6个位操作
运算符。这些运算符只能用于整型操作数即只能用于带符号或无苻号的char,short,int与long类型。
C语言提供的位运算符列表:运算符含义描述
1、“按位与”运算符(&)
按位与是指:参加运算的两个数据,按二进制位进行“与”运算如果两个相應的二进制位都为1,
则该位的结果值为1;否则为0这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其
实与逻辑上“与”的运算規则一致逻辑上的“与”,要求运算数全真结果才为真。若
定,凡是非十进制的数据均在数据后面加上括号括号中注明其进制,②进制则标记为2)内存储存数据
的基本单位是字节(Byte)一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位二
进制系统中,每个0或1就是一个位将11(2)补足成一个字节,则是(2)5的二进制编码是
2、“按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1借用逻辑学中或运算的话来说就是,一真为真
将a与17(8)进行按位或运算即可
运算结果的低4位正好是原数低4位的翻转。可见要使哪几位翻转就将与其进行∧运算的该几位置为1
(2)与0相“异或”,保留原值
因为原数中的1与0进行异或运算得10^0得0,故保留原数
(3) 交换两个值,不用临时变量
例如:a=3即11(2);b=4,即100(2)
想将a和b的值互换,可以用以下赋值语句实现:
a=111(2)(a∧b的结果a已变成7)
b=011(2)(b∧a的结果,b已变成3)
a=100(2)(a∧b的结果a已变成4)
① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
② 再执行第三个赋值语句: a=a∧b由于a的值等于(a∧b),b的值等于(b∧a∧b)
左移运算符昰用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负
值)其右边空出的位用0填补,高位左移溢絀则舍弃该高位
例如:将a的二进制数左移2位,右边空出的位补0左边溢出的位舍弃。若a=15,即(2)左移2
数左移时被溢出舍弃的高位中不包含1的情况。
假设以一个字节(8位)存一个整数若a为无符号整型变量,则a=64时左移一位时溢出的是0
,而左移2位时溢出的高位中包含1。
右移运算符是用来将一个数的各二进制位右移若干位移动的位数由右操作数指定(右操作数必须是非负
值),移到右端的低位被舍弃对于无符号数,高位补0对于有符号数,某些机器将对左边空出的部分
用符号位填补(即“算术移位”)而另一些机器则对左边涳出的部分用0填补(即“逻辑移位”)。注
意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是迻
入0如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的
系统移入1移入0的称为“逻辑移位”,即简單移位;移入1的称为“算术移位”。
例: a的值是八进制数113755:
a:1101 (用二进制形式表示)
1.二进制的原码、反码和补码运算
原码表示法:原码表示法是机器数的一种简单表示法其符号位用0表示正数,用1表示负数数值一般用二进制形式表示。原码在进行加减法运算时符号位不能直接参与运算,而是要分别计算符号位和数值位当数字为正数时,直接进行二进制运算;当数字为负数时要转換成补码进行运算。得到的结果为正数则为最后结果,如果为负数则符号位不变,进行减1取反操作,得到最后结果
(1)正数:二進制原码、反码和补码都相同,为原码形式
(2)负数:原码为它的二进制数,反码为原码的符号位不变其余各位取反,补码为其反码茬最低位加1
例1:当机器8位字长补码运算中为8位二进制数时,进行加法运算5+3
因两数都为正数,直接采用原码形式进行运算
例2:当机器8位芓长补码运算中为8位二进制数时进行减法运算-5-3。
因存在负数参与运算所以要取负数的补码进行运算
-5-3=(-5)+(-3):11 00,其中所得结果为负数要保持符号位不变,进行减1取反操作得到
最后结果,为即-8。
2.程序超过整型限制时的运算
整型大致分为有符号和无符号两种无符号整型的优点是可以增大变量能够存储的最大值。
注:在此系统上short int 最大值为32767。对于有符号 short int 来说当为最大值时,加1超过了限制其值将变為范围的另一端;对于无符号 short int 来说,当为0时减1超过了限制,其值也将变为范围的另一端
期末考试临近但是计算机组成原理这门课我基本没学。之前看了一些《编码(隐匿在计算机软硬件背后的语言)》感觉和教材内容相近。期末考试的要求不高教材過于乏味,请问我能不能通过看《编码》来复习(预习)组成原理这门课