12位运算

合集下载

加法的进位与退位运算

加法的进位与退位运算

加法的进位与退位运算在数学中,加法运算是我们最早接触的基本算术运算之一。

加法运算涉及了进位和退位的概念,它们在加法运算中起到了重要的作用。

本文将详细介绍加法的进位与退位运算。

一、进位运算在进行多位数加法运算时,当两个相同位置的数字相加时,如果结果超过了该位置的最大值(一般为9),就需要进位。

进位是指将前一位的数值加1。

进位运算的规则如下:1. 个位进位:当个位相加结果超过9时,需要进位。

例如,8 + 7 = 15,个位相加结果为5,超过了9,因此需要进位。

进位后的结果为15。

2. 十位进位:当十位相加结果超过9时,需要进位。

例如,74 + 48 = 122,个位相加结果为2,十位相加结果为12,超过了9,因此需要进位。

进位后的结果为122。

3. 百位进位:当百位相加结果超过9时,需要进位。

例如,135 + 285 = 420,个位相加结果为5,十位相加结果为20,百位相加结果为4,超过了9,因此需要进位。

进位后的结果为420。

二、退位运算与进位运算相反,退位运算在进行多位数减法运算时出现。

当计算的结果小于被减数时,就需要退位。

退位是指从前一位借位,使当前一位的数值减1。

退位运算的规则如下:1. 个位退位:当个位相减结果小于0时,需要退位。

例如,8 - 7 = 1,个位相减结果为1,小于0,因此需要退位。

退位后的结果为1。

2. 十位退位:当十位相减结果小于0时,需要退位。

例如,74 - 48= 26,个位相减结果为6,十位相减结果为2,小于0,因此需要退位。

退位后的结果为26。

3. 百位退位:当百位相减结果小于0时,需要退位。

例如,135 - 285 = -150,个位相减结果为5,十位相减结果为15,百位相减结果为-1,小于0,因此需要退位。

退位后的结果为-150。

进位与退位运算在加法运算中起到了重要的作用,使得我们可以进行多位数的相加和相减。

掌握进位与退位运算的方法,有助于我们更准确地进行加法运算,提高计算的准确性与效率。

C语言课件第12章 位运算

C语言课件第12章 位运算

1.
位运算规则: 位运算规则: A 0 0 1 1 B 0 1 0 1 A&B 0 0 0 1 A|B 0 1 1 1 A^B 0 1 1 0 ~a 1 1 0 0
例12.1 若 a=(15)10=(00001111)2, a=(15) b=(80)10=(01010000)10 则: a&b = 0000 0000, a|b = 0101 1111, a^b =01011111 , ~a = 1111 0000
/*设 a 为待处理的数据,转换成二进制为00001000, /*设 为待处理的数据,转换成二进制为00001000, b用来保存将a的高4位清0后的结果*/ 用来保存将a的高4位清0后的结果* main() { unsigned char a,b,c; a=8; b=a&0x0f; c=b|0xa0; /*c用于保存最终结果*/ b=a&0x0f; c=b|0xa0; /*c用于保存最终结果 用于保存最终结果* printf("%x" printf("%x",c); }
4)左移,右移运算实现将一个数的各个二进制位向左,向 4)左移,右移运算实现将一个数的各个二进制位向左,向 右移若干位. 左移:将一个数的各个二进制位左移若干位,高位左移 左移:将一个数的各个二进制位左移若干位, 后舍弃,低位补0 后舍弃,低位补0 . 若定义: 若定义: int a=8; 即a= 0000 1000 0010 0000 0000 右移:将一个数的各个二进制位右移若个位,低位右移 右移:将一个数的各个二进制位右移若个位, 后舍弃, 还是补1 后舍弃,高位补 0还是补1,要区别有符号数还是无符号 无符号数高位补0 有符号数高位补原符号位. 数:无符号数高位补0,有符号数高位补原符号位. 若定义 unsigned int a=8; 即 00001000, a=8; 00001000, 则语句 a=a>>2 ;将 a 的各二进制位右移 2 位,空出的 高位补 0.结果为: 0000 0010 , 则语句a=a<<2; 则语句a=a<<2;

常用位操作 位运算应用口诀

常用位操作 位运算应用口诀

【转载】常用位操作位运算应用口诀清零取反要用与,某位置一可用或若要取反和交换,轻轻松松用异或移位运算要点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=b1b=a1^b1^b1 b=a^b a=a1^b1,b=a1a=b1^a1^a1 a=a^b a=b1,b=a1二进制补码运算公式:-x = ~x + 1 = ~(x-1)~x = -x-1-(~x) = x+1~(-x) = x-1x+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)+yx&y = (~x ¦y)-~xx==y: ~(x-y ¦y-x)x!=y: x-y ¦y-xx < 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 // x ^(~ (x >> 31) + 1) + x >> 31}(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判断是否只有一个1: n & (n-1) == 0例如求从x位(高)到y位(低)间共有多少个1public 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;}。

c语言34种运算符意义和用法

c语言34种运算符意义和用法

文章标题:深度解析C语言34种运算符的意义和用法在计算机编程世界中,C语言是一种广泛应用的计算机程序设计语言,它为程序员提供了丰富的运算符来完成各种数学和逻辑运算。

作为一个编程语言中至关重要的部分,了解和掌握C语言的运算符对于程序员来说至关重要。

在本文中,我们将深度解析C语言的34种运算符,包括它们的意义和用法,以帮助读者全面了解这些运算符的特点和功能。

1. 赋值运算符赋值运算符是C语言中最基本的运算符之一,用于将右侧的数值或表达式赋给左侧的变量。

赋值运算符由等号(=)表示,例如:a = 10;将10这个数值赋给变量a。

2. 算术运算符算术运算符用于执行基本的数学运算,包括加法(+)、减法(-)、乘法(*)、除法(/)和求模(%)等。

这些运算符在C语言中十分常见,用于处理数字类型的变量。

3. 自增、自减运算符自增(++)和自减(--)运算符用于增加或减少变量的值,它们可以用作前缀或后缀运算符,分别表示在表达式中先执行运算或者先获取变量的值再执行运算。

4. 关系运算符关系运算符用于比较两个值的大小关系,包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)等。

这些运算符经常用于条件判断和逻辑运算中。

5. 逻辑运算符逻辑运算符用于执行逻辑运算,包括与(&&)、或(||)和非(!)运算。

它们通常用于条件判断和逻辑组合中,能够帮助程序员处理复杂的逻辑关系。

6. 位运算符位运算符用于对整数类型的数值进行位操作,包括按位与(&)、按位或(|)、按位取反(~)、按位异或(^)和左移(<<)、右移(>>)等。

位运算符在处理底层数据操作时十分重要。

7. 条件运算符条件运算符(?:)是C语言中唯一的三目运算符,用于根据条件的真假选择不同的值。

它使得代码更加简洁和可读性更强。

8. sizeof运算符sizeof运算符用于获取数据类型或变量的字节大小,它在编程时经常用于内存分配和操作中。

百以内数的进位与退位运算

百以内数的进位与退位运算

百以内数的进位与退位运算在数学学习中,进位与退位运算是非常基础且重要的运算概念。

它们在百以内的数的运算中占据着重要地位。

本文将详细讨论百以内数的进位与退位运算,通过几个具体例子来加深理解。

一、进位运算进位运算指的是在进行加法运算时,若某位上的数相加大于等于10,就会产生进位,进一位。

以十位为例,当个位相加等于或超过10时,个位就需要进位给十位。

进位的数值等于个位的和除以10的整数部分。

例如,计算99 + 3时,个位9和3相加等于12,超过了10,所以需要进位。

进位的数值为12 ÷ 10 = 1,将1进位给十位,最终的结果是102。

同样地,当进行减法运算时,若某位上的数小于被减数对应位上的数,就需要向上一位借位。

以十位为例,当个位相减小于0时,十位就需要借位给个位。

例如,计算56 - 8时,个位6减去8等于-2,所以需要向十位借位。

借位的数值等于被减数对应位上的数除以10的整数部分加上1。

例如,将8借位给个位后,个位变成16,十位就需要减去1,最终的结果是48。

二、退位运算退位运算是进位运算的逆过程,即在百以内的数进行减法运算时,若结果中某一位为负数,则需要退位,借一位。

与进位相反,退位的数值等于个位的差除以10的绝对值。

以个位为例,当减数对应位小于被减数对应位时,个位就需要退位。

例如,计算103 - 45时,个位3减5等于-2,所以需要退位。

退位的数值为-2 ÷ 10 = -0.2,所以退位后个位变成8,十位也需要减去1,最终的结果是58。

同样地,当进行加法运算时,若某位的结果大于等于10,就需要向下一位退位。

以百位为例,当十位相加大于等于10时,百位就需要退位。

例如,计算81 + 27时,十位8和7相加等于15,超过了10,所以需要退位。

退位的数值等于十位的和除以10的整数部分。

例如,十位的和为15,退位的数值为15 ÷ 10 = 1,将1退位给百位,最终的结果是108。

12bit 转 10bit

12bit 转 10bit

12bit 转 10bit12位转10位是指将一个12位的二进制数转换为一个10位的二进制数。

在计算机中,二进制数是由0和1组成的数字系统,而位数表示二进制数中的位数。

转换的过程涉及到将12位二进制数分割成高位和低位两个部分,并对高位部分进行处理以确保转换结果的准确性。

我们需要了解二进制数的表示方法。

在二进制数中,每一位的权值是2的幂次方,从右向左依次递增。

例如,一个八位的二进制数的权值分别为2^7、2^6、2^5、2^4、2^3、2^2、2^1、2^0。

对于一个12位的二进制数,其权值分别为2^11、2^10、2^9、2^8、2^7、2^6、2^5、2^4、2^3、2^2、2^1、2^0。

接下来,我们需要将12位的二进制数分割成高位和低位两个部分。

高位部分由前两位组成,低位部分由后十位组成。

我们可以使用位运算符来实现这一步骤。

通过将12位二进制数与0xFFC0进行按位与操作,可以得到高位部分。

而通过将12位二进制数与0x003F进行按位与操作,可以得到低位部分。

然后,我们需要对高位部分进行处理。

在12位转10位的过程中,高位部分需要进行移位操作,以准备与低位部分进行合并。

具体来说,高位部分需要向右移动2位,以消除低位部分的影响。

移位操作可以通过将高位部分与0x03FF进行按位与操作来实现。

我们将处理后的高位部分与低位部分进行合并,得到最终的10位二进制数。

合并操作可以通过将高位部分与低位部分进行按位或操作来实现。

12位转10位的过程包括分割高位和低位、处理高位部分、合并高位和低位三个步骤。

通过按照这个步骤进行操作,我们可以将一个12位的二进制数转换为一个10位的二进制数。

需要注意的是,转换过程中需要保证数据的准确性和精度。

因此,在进行位运算和移位操作时,需要使用适当的数据类型来存储中间结果,以避免溢出或精度损失的问题。

此外,在实际应用中,还需要考虑到二进制数的符号位,以确保转换结果的正确性。

总结一下,12位转10位是一种将12位二进制数转换为10位二进制数的操作。

第12章 位运算

第12章 位运算
2012年4月22日5时28分 1
第 12章 位运算
~运算常用于产生一些特殊的数。 运算常用于产生一些特殊的数。 xFF00 00, 如高 8 位全 1 低 8 位全 0 的数 0xFF00, 按位取 00FF FF。 位的系统中, 反后变为 0x00FF 。 ~ 1, 在 16 位与 32 位的系统中 , 的整数。 都代表只有最低位为 0 的整数。 运算是位运算中唯一的单目运算, ~运算是位运算中唯一的单目运算, 也是唯一具有右结 合性的位运算。 合性的位运算。
第 12章 位运算
12.1 位逻辑运算
按位取反运算 1. 按位取反运算 运算符: 运算符: ~ 按位取反运算用来对一个二进制数按位取反, 按位取反运算用来对一个二进制数按位取反, 即 0 位变 1, 1 位变 0。 例如: ~25, 25的二进制表示为: ~ 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1111111111100110 即 -26。 。
(2)a | 0xFFFF, a的每一位全置 1。 a的每一位全置 (2)a
2012年4月22日5时28分
5
第 12章 位运算
按位异或运算 4. 按位异或运算 运算符: 运算符: ^ 操作数的对应位相同, 操作数的对应位相同, 则该位的运算结果为 0, 否则为 1。 例如: 29^ 的二进制表示为: 例如: 0x29^0x37 , 0x29 与 0x37 的二进制表示为: 0000000000101001与0000000000110111 0000000000101001与0000000000110111 按位异或结果为: 按位异或结果为: 0000000000011110, 0000000000011110, 即等于 0x1e。 利用^运算将数的特定位翻转, 保留原值, 利用^运算将数的特定位翻转, 保留原值, 不用临时变 量交换两个变量的值。 量交换两个变量的值。

计算机基础知识(计算机的基本运算)

计算机基础知识(计算机的基本运算)

计算机基础知识(计算机的基本运算)计算机基础知识(计算机的基本运算)计算机是一种能够进行各种数学运算的智能机器。

在计算机的背后,有着一系列基础知识和技术,使其能够完成这些运算任务。

本文将介绍计算机的基本运算的相关知识。

一、二进制数系统计算机使用二进制数系统来进行运算。

在二进制数系统中,数字由0和1两个数字组成。

与十进制数系统类似,二进制数系统也有个位、十位、百位等,但权值是以2的幂次递增的。

二、基本运算符计算机的基本运算符包括加法、减法、乘法和除法。

这些运算符在计算机中都有对应的操作,它们是计算机进行基本运算的基石。

1. 加法在计算机中,加法使用“+”符号表示。

它的作用是将两个数相加,并返回它们的和。

例如,3 + 4 = 7。

2. 减法减法在计算机中使用“-”符号表示。

它的作用是从一个数中减去另一个数,并返回它们的差。

例如,7 - 4 = 3。

3. 乘法乘法使用“*”符号表示。

它的作用是将两个数相乘,并返回它们的积。

例如,3 * 4 = 12。

4. 除法除法在计算机中使用“/”符号表示。

它的作用是将一个数除以另一个数,并返回它们的商。

例如,12 / 4 = 3。

三、算术运算优先级在进行复杂的运算时,计算机会按照一定的优先级进行计算。

以下是一些常见的运算符优先级:1. 括号括号具有最高的优先级,计算机会先计算括号内的表达式。

2. 乘法和除法乘法和除法的优先级高于加法和减法,计算机会先进行乘法和除法运算。

3. 加法和减法加法和减法的优先级较低,计算机会在进行乘法和除法运算后再进行加法和减法运算。

四、位运算除了基本的加减乘除运算,计算机还可以进行位运算。

位运算是针对二进制数的运算,它对数字的每一位进行操作。

1. 位与(&)位与运算符“&”对两个数字的对应位进行与运算,即两个位都为1时才返回1,否则返回0。

2. 位或(|)位或运算符“|”对两个数字的对应位进行或运算,即两个位有一个为1时就返回1,否则返回0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C程序设计(第三版) 28
C程序设计(第三版)

23
12.2 位运算举例
例12.1 取一个整数a从右端开始的4~7位
① 先使a右移4位:a >> 4 目的是使要取出的那几位移到最右端
未右移时的情况
右移4位后的情况
C程序设计(第三版)

C程序设计(第三版)

14
即等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b =b∧a;”相当于b=b∧(a∧b)。 ② 再执行第三个赋值语句: a=a∧b。由于a的 值等于(a∧b),b的值等于(b∧a∧b), 因此,相当于a=a∧b∧b∧a∧b,即a的值等 于a∧a∧b∧b∧b,等于b。 a得到b原来的值。
C程序设计(第三版)

01111010 00001111 01110101

12
(2) 与0相∧,保留原值
例如:012∧00=012

00001010 00000000 00001010
因为原数中的1与0进行∧运算得)
即:a=84,b=59 c=a&b=16
C程序设计(第三版)

8
12.1.2 “按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位 的结果值为1。 即 0|0=0,0|1=1,1|0=1,1|1=1
例: 060|017,将八进制数60与八进制数17进行 按位或运算。 00110000 | 00001111 00111111
C程序设计(第三版)

10
12.1.3“异或”运算符(∧)
异或运算符∧也称XOR运算符。它的规则是: 若参加运算的两个二进制位同号则结果为0(假) 异号则结果为1(真)
即:0∧0=0,0∧1=1,1∧0=1, 1∧1=0 例:

00111001 00101010 00010011

例如:将一个存储单元中的各二进制位左移 或右移一位,两个数按位相加等。

C语言提供位运算的功能,与其他高级语言 (如PASCAL)相比,具有很大的优越性。

C程序设计(第三版)

3
12.1 位运算符和位运算
C语言提供的位运算符有:
运算符 含义 & 按位与 | 按位或 ∧ 按位异或 运算符 ~ << >> 含义 取反 左移 右移
C程序设计(第三版)

9
应用:按位或运算常用来对一个数据的某 些位定值为1。例如:如果想使一个数a 的低4位改为1,只需将a与017进行 按位或运算即可。 例: a是一个整数(16位), 有表达式:a | 0377 则低8位全置为1,高8位保留原样。
C程序设计(第三版) 19
在右移时,需要注意符号位问题: 对无符号数,右移时左边高位移入0;对于 有符号的值,如果原来符号位为0(该数为正), 则左边也是移入0。如果符号位原来为1(即负 数),则左边移入0还是1,要取决于所用的计算 机系统。有的系统移入0,有的系统移入1。移 入0的称为“逻辑右移”,即简单右移;移入1 的称为“算术右移”。

22
12.1.8 不同长度的数据进行位运算 如果两个数据长度不同(例如long 型和int型),进行位运算时(如a & b,而a为 long型,b为int型),系统会将二者按右端对 齐。如果b为正数,则左侧16位补满0;若b为 负数,左端应补满1;如果b为无符号整数型, 则左侧添满0。
C程序设计(第三版)

21
12.1.7
位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符。 例如: &=, |=, >>=, <<=, ∧= 例: a & = b相当于 a = a & b a << =2相当于a = a << 2
C程序设计(第三版)
C程序设计(第三版)
③ 将上面①、②进行&运算。
即八进制数15,十进制数13。
25
例12.2 循环移位。
要求将a进行右循环移位 将a右循环移n位, 即将a中原来左面 (16-n)位右 移n位,原来右端 n位移到最左面n 位。
C程序设计(第三版)
c
C程序设计(第三版)

7
(3)保留一位的方法:与一个数进行&运算, 此数在该位取1。
例:有一数01010100,想把其中左面第 3、4、5、7、8位保留下来,运算如下: 01010100(84) & 00111011(59) 00010000(16)
C程序设计(第三版)

20
例: a的值是八进制数113755:
a:1001011111101101 (用二进制形式表示) a>>1: 0100101111110110 (逻辑右移时) a>>1: 1100101111110110 (算术右移时) 在有些系统中,a>>1得八进制数045766,而在 另一些系统上可能得到的是145766。Turbo C和其 他一些C编译采用的是算术右移,即对有符号数右 移时,如果符号位原来为1,左面移入高位的是1。
例:3&5并不等于8,应该是按位与运算:
00000011(3) & 00000101(5) 00000001(1) 3&5的值得1
C程序设计(第三版)
注意:如果参加&运算的是 负数(如-3&-5),则要以 补码形式表示为二进制数 ,然后再按位进行“与” 运算。
5
C程序设计(第三版)

18
12.1.6 右移运算符(>>)
右移运算符是a>>2表示将a的各二进制位 右移2位,移到右端的低位被舍弃,对无符号 数,高位补0。 例如:a=017时: a的值用二进制形式表示为00001111, 舍弃低2位11: a>>2=00000011 右移一位相当于除以2 右移n位相当于除以2n。
27
程序如下: 运行情况如下: #include <stdio.h> a=157653,n=3 void main() 15765 3 { unsigned a,b,c; 75765 int n; scanf(“a=%o,n=%d”,&a,&n); b=a<<(16-n); c=a>>n; c=c|b; 运行开始时输入八进制数157653, printf(“%o\n%o”,a,c); 即二进制数1101111110101011 } 循环右移3位后得二进制数0111101111110101 即八进制数75765
24
② 设置一个低4位全为1,其余全为0的数。
~ ( ~ 0 << 4 )
程序如下: (a >> 4) & ~ ( ~ 0 << 4 ) #include <stdio.h> void main() { unsigned a,b,c,d; 运行情况如下:331(输入) scanf(“%o”,&a); 331, 217 (a的值) b=a>>4; 15, 13 (d的值) c=~(~0<<4); 输入a的值为八进制数331, d=b&c; 其二进制形式为11011001 printf(“%o,%d\n%o,%d\ n”,a,a,d,d); 经运算最后得到的 d为00001101
按位与的用途: (1) 清零。
若想对一个存储单元清零,即使其全部二进制位 为0,只要找一个二进制数,其中各个位符合以下 条件:原来的数中为1的位,新数中相应位为0。 然后使二者进行&运算,即可达到清零目的。 例: 原有数为0010101 1,另找一个数,设它为1 0010100,这样在原 数为1的位置上,该数的相 应位值均为0。将这两个数 进行&运算:
1111111111101010 (八进制数177752)
C程序设计(第三版)

16
12.1.5 左移运算符(<<)
左移运算符是用来将一个数的各二进制 位全部左移若干位。 例如:a=<<2 将a的二进制数左移2位,右补0。
若a=15,即二进制数00001111, 左移2位得00111100,(十进制数60)
C程序设计(第三版)
00101011 & 10010100 00000000

6
(2) 取一个数中某些指定位。
如有一个整数a(2个字节),想要取其 中的低字节,只需将a与8个1按位与即可。
a b
00101100 1010110 0
00000000 1111111 1 00000000 1010110 0

26
步骤: ① 将a的右端n位先放到b中的高n位中, 实现语句:b=a<<(16-n); ② 将a右移n位,其左面高位n位补0, 实现语句:c=a>>n; ③ 将c与b进行按位或运算,即c=c|b;
C程序设计(第三版)

即:071∧052=023 (八进制数)
C程序设计(第三版) 11
∧运算符应用:
(1) 使特定位翻转 设有01111010,想使其低4位翻 转,即1变为0,0变为1。可以将它与0 0001111进行∧运算,即:
运算结果的低4位正好 是原数低4位的翻转。可 见,要使哪几位翻转就将 与其进行∧运算的该几位 置为1即可。

13
(3) 交换两个值,不用临时变量
例如:a=3,b=4。 想将a和b的值互换,可以用以下赋值语句实现: a=a∧b; b=b∧a; a=011 a=a∧b; (∧)b=100
a=111(a∧b的结果,a已变成7) (∧)b=100 b=011(b∧a的结果,b已变成3) (∧)a=111 a=100(a∧b的结果,a已变成4)
相关文档
最新文档