位运算的一些应用技巧
C语言程序设计位运算

C语言程序设计位运算位运算是一种常用的C语言程序设计技巧,可用于对二进制数据进行高效操作。
通过直接操作二进制位,位运算可以实现很多功能,例如位与、位或、位异或、位取反等运算,它们在数字计算、逻辑运算、数据压缩和加密算法等领域中发挥着重要作用。
本文将介绍C语言中常见的位运算操作及其应用。
1.位与运算(&):用于提取两个操作数对应位置上的公共位。
当两个操作数对应位置上的位都为1时,结果位为1,否则结果位为0。
位与运算主要用于屏蔽操作和提取二进制数据的一些位。
例如:```cint x = 12; // 二进制表示为 1100int y = 10; // 二进制表示为 1010int result = x & y; // 结果为 1000,即8```2.位或运算(,):用于将两个操作数对应位置上的位按位相加。
当两个操作数对应位置上的位至少有一个为1时,结果位为1,否则结果位为0。
位或运算主要用于设置位和合并二进制数据。
例如:```cint x = 12; // 二进制表示为 1100int y = 10; // 二进制表示为 1010int result = x , y; // 结果为 1110,即143.位异或运算(^):用于将两个操作数对应位置上的位进行异或操作。
当两个操作数对应位置上的位相同时,结果位为0,否则结果位为1、位异或运算主要用于数据加密和数据校验。
例如:```cint x = 12; // 二进制表示为 1100int y = 10; // 二进制表示为 1010int result = x ^ y; // 结果为 0110,即6```4.位取反运算(~):用于对操作数的每一个二进制位进行取反操作。
当操作数其中一位置上的位为1时,取反结果中对应位置为0,反之为1、位取反运算主要用于反转二进制数据。
例如:```cint x = 12; // 二进制表示为 1100int result = ~x; // 结果为 0011,即-13```5.左移运算(<<):用于将操作数的二进制位向左移动指定的位数。
C语言中的位运算的技巧

C语⾔中的位运算的技巧⼀、位运算实例1、⽤⼀个表达式,判断⼀个数X是否是2的N次⽅(2,4,8,16.....),不可⽤循环语句。
X:2,4,8,16转化成⼆进制是10,100,1000,10000。
如果减1则变成01,011,0111,01111。
两者做按位与运算,结果如果为0,则X是2的N次⽅。
2、统计⼀个整数的⼆进制中1的个数int count_number_of_one(int number){ int counter = 0; while (number) { counter++; number &= number - 1 ; } return counter;}⼆、位运算基础很多⾼级的动态规划题⽬或者⼀些基础的运算往往需要较⾼的执⾏效率和较低的空间需求,或者需要表⽰⼀些状态集合,⽽位运算刚好能满⾜这⼀切。
很多的时候,恰当的位运算使⽤也能使程序变得更加简洁和优美。
1、位运算法则位运算是各位互不影响的,⽐如A为1010⽽B为1100,那么有A&B=1000A|B=1110A^B=0110~A=11110101 (1的个数是取决于A的类型的,这⾥认为A的类型是8位整型)另外两种位运算是位移运算a<<b,a>>b。
前者表⽰将a的所有位向左移动b位,后者则表⽰将a的所有位向右移动b位。
对于⾮负整数(往往这也是我们最关⼼的),新空出的位将会被0取代。
⽐如A为1001,⽽B为3,那么A>>B则为1。
⼤多数情况下可以简单地认为左移b位就是乘以2b,⽽右移b位则是除以(整除)2b。
当然这是存在例外的——对于负数是不能这么简单认为的:⽐如在GNU GCC/G++ 编译条件下,若A=-1,你会发现对于任何位移运算A<<B,⽆论B的取值如何,其结果均为-1。
因此请注意,在位移运算下务必确保对⾮负整数进⾏运算,以免发⽣不必要的问题。
对于位移运算最常⽤的操作就是取⼀个特定的位——⽐如1< xx>2、对于集合的表⽰⼤多数时候,我们可以⽤⼀个整数来表⽰⼀个包含不超过32(当然如果使⽤64位整型变量也可以是64个)个元素的集合——对于每⼀个位,如果元素为1,则表⽰存在当前位所对应的集合成员,如果是0,则表⽰这个集合成员是不存在的。
oi 位运算

oi 位运算OI 位运算——算法竞赛中的一把利器算法竞赛中,位运算一直都是一把很有威力的利器。
而且它应用广泛,可以用来解决各种问题。
在OI竞赛中,掌握位运算技巧会为选手的获胜增添一份保障。
本文将分别介绍常用的位运算操作符,以及它们的具体应用。
一、右移运算符右移运算符(>>)可以将一个数的二进制位向右移动n位,移动后补零。
比如,10的二进制码为1010,右移1位,得到0101,即5。
右移运算常用于对2取整。
二、左移运算符左移运算符(<<)可以将一个数的二进制位向左移动n位,移动后补零。
比如,4的二进制码为0100,左移1位,得到1000,即8。
左移运算常用于从10进制转换为2进制,以及计算2的n次幂。
三、与运算符与运算符(&)会对两个数的二进制位进行与运算,只有两个二进制位都是1时,结果才为1。
比如,对于3和5进行与运算,得到结果1。
与运算常用于判断一个数的二进制位的某个二进制位是否为1,或者提取二进制位的部分信息。
四、或运算符或运算符(|)会对两个数的二进制位进行或运算,只要两个二进制位中有一个是1,结果就为1。
比如,对于3和5进行或运算,得到结果7。
或运算常用于将二进制位的某些位置为1,或者将多个二进制位合并成一个整数。
五、异或运算符异或运算符(^)会对两个数的二进制位进行异或运算,只有两个二进制位不相同时,结果才为1。
比如,对于3和5进行异或运算,得到结果6。
异或运算常用于交换两个数的值,或者判断两个数的二进制位的某些位置是否相同。
六、取反运算符取反运算符(~)会对一个数的二进制位进行取反操作。
比如,对于3进行取反操作,得到结果为-4。
取反运算常用于取得整数的相反数,或者反转二进制位的值。
综述,位运算在算法竞赛中是占有举足轻重的地位的。
掌握位运算技巧可以帮助选手更高效地解决问题,提升自己的竞赛水平。
在实际应用中,位运算要多想,多练,才能真正掌握技巧,更好地应用位运算的威力。
位操作基础篇之位操作全面总结

位操作基础篇之位操作全⾯总结位操作篇共分为基础篇和提⾼篇,基础篇主要对位操作进⾏全⾯总结,帮助⼤家梳理知识。
提⾼篇则针对各⼤IT公司如微软、腾讯、百度、360等公司的笔试⾯试题作详细的解答,使⼤家能熟练应对在笔试⾯试中位操作题⽬。
下⾯就先来对位操作作个全⾯总结,欢迎⼤家补充。
在计算机中所有数据都是以⼆进制的形式储存的。
位运算其实就是直接对在内存中的⼆进制数据进⾏操作,因此处理数据的速度⾮常快。
在实际编程中,如果能巧妙运⽤位操作,完全可以达到四两拨千⽄的效果,正因为位操作的这些优点,所以位操作在各⼤IT 公司的笔试⾯试中⼀直是个热点问题。
因此本⽂将对位操作进⾏如下⽅⾯总结:⼀.位操作基础,⽤⼀张表描述位操作符的应⽤规则并详细解释。
⼆.常⽤位操作⼩技巧,有判断奇偶、交换两数、变换符号、求绝对值。
三.位操作与空间压缩,针对筛素数进⾏空间压缩。
四.位操作的趣味应⽤,列举了位操作在⾼低位交换、⼆进制逆序、⼆进制中1的个数以及缺失的数字这4种趣味应⽤。
希望读者能认真学习和亲⾃上机输⼊代码进⾏实验,相信通过本⽂及适当的练习可以使你对位操作有更加深⼊的了解,在笔试⾯试中遇到位操作相关试题能更加从容。
⼀.位操作基础基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所⽰:符号描述运算规则 by MoreWindows& 与两个位都为1时,结果才为1| 或两个位都为0时,结果才为0^ 异或两个位相同为0,相异为1~ 取反0变1,1变0<< 左移各⼆进位全部左移若⼲位,⾼位丢弃,低位补0>> 右移各⼆进位全部右移若⼲位,对⽆符号数,⾼位补0,有符号数,各编译器处理⽅法不⼀样,有的补符号位(算术右移),有的补0(逻辑右移)注意以下⼏点:1.在这6种操作符,只有~取反是单⽬操作符,其它5种都是双⽬操作符。
2.位操作只能⽤于整形数据,对float和double类型进⾏位操作会被编译器报错。
C语言中的位运算技巧

C语言中的位运算技巧位运算是计算机中一种高效且常用的运算方式,它可以对数据进行处理、操作和压缩,广泛应用于各个领域。
在C语言中,位运算提供了一系列技巧,可以帮助程序员更好地处理数据。
本文将介绍一些常用的C语言中的位运算技巧。
一、位运算的基础知识在进行位运算之前,我们需要了解一些基础知识。
在C语言中,位运算符有以下几种:1. 与运算符(&):对两个操作数的每个位进行“与”运算,只有当两个操作数对应位都为1时,结果的对应位才为1。
2. 或运算符(|):对两个操作数的每个位进行“或”运算,只有当两个操作数对应位至少有一个为1时,结果的对应位才为1。
3. 异或运算符(^):对两个操作数的每个位进行“异或”(相同为0,不同为1)运算,只有当两个操作数对应位不同时,结果的对应位才为1。
4. 左移运算符(<<):将一个数的全部位向左移动若干位,左边超出的位将被丢弃,右边补0。
5. 右移运算符(>>):将一个数的全部位向右移动若干位,如果数是无符号的,则左边全部移入的位将被丢弃,右边补0;如果数是有符号的,则按照机器的规则决定。
二、位运算技巧1. 判断奇偶性我们可以通过位与运算符(&)来判断一个数的奇偶性。
假设有一个数x,如果x与1进行位与运算后的结果为0,则说明x为偶数;如果结果为1,则说明x为奇数。
2. 交换两个数我们可以通过异或运算符(^)来交换两个数的值,而无需使用临时变量。
假设有两个数a和b,我们可以通过以下方式进行交换:a = a ^ b;b = a ^ b;a = a ^ b;3. 判断一个数的二进制表示中有几个1我们可以通过循环位与运算符(&)和右移运算符(>>)来计算一个数的二进制表示中有多少个1。
假设有一个数x,我们可以通过以下方式计算1的个数:int count = 0;while(x != 0){if(x & 1){count++;}x = x >> 1;}4. 将某一位设置为1我们可以通过左移运算符(<<)和或运算符(|)来将某一位设置为1。
c语言的位操作

c语言的位操作位操作是计算机科学中常见的一种技术,它能够对数据的二进制位进行直接操作,实现高效的编程处理。
C语言作为一种低级语言,提供了强大的位操作功能,使得程序员可以更加灵活地处理数据。
本文将介绍C语言中的位操作,并探讨其应用场景。
一、位操作简介位操作是指直接对数据的二进制位进行操作,通常通过使用位运算符来实现。
C语言中的位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)以及左移(<<)和右移(>>)等。
利用这些运算符,程序员可以对变量的二进制表示进行逐位的操作,实现一些特定的需求。
二、位运算符的使用1. 按位与(&):将两个操作数的对应位进行与操作,结果中的每一位都是两个操作数对应位上的逻辑与结果。
例如,对于二进制数1101和1011,进行按位与运算得到结果1001。
2. 按位或(|):将两个操作数的对应位进行或操作,结果中的每一位都是两个操作数对应位上的逻辑或结果。
例如,对于二进制数1101和1011,进行按位或运算得到结果1111。
3. 按位异或(^):将两个操作数的对应位进行异或操作,结果中的每一位都是两个操作数对应位上的异或结果。
如果两个操作数的对应位相同,则结果为0;如果两个操作数的对应位不同,则结果为1。
例如,对于二进制数1101和1011,进行按位异或运算得到结果0110。
4. 按位取反(~):对一个操作数的每一位进行取反操作,即0变为1,1变为0。
例如,对于二进制数1101,进行按位取反运算得到结果0010。
5. 左移(<<):将一个操作数中的二进制位向左移动指定的位数。
移出的位将被丢弃,右侧用0填充。
例如,对于二进制数1101,进行左移运算左移2位得到结果110100。
6. 右移(>>):将一个操作数中的二进制位向右移动指定的位数。
移出的位将被丢弃,左侧用0或者符号位填充。
例如,对于二进制数1101,进行右移运算右移2位得到结果0011。
C语言中的位运算技巧
C语言中的位运算技巧位运算是C语言中一种十分重要且强大的运算方式,通过对二进制位的操作,可以实现许多高效而巧妙的计算。
本文将介绍一些常用的位运算技巧,以帮助大家更好地理解和应用C语言中的位运算操作。
一、与运算(&)与运算是位运算中最基本的一种运算,它的运算规则如下:如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
1. 判断奇偶性我们可以通过与运算来判断一个整数的奇偶性。
由于二进制数的最低位为1表示奇数,为0表示偶数,所以通过与1进行与运算即可得到结果:int num = 6;if (num & 1) {printf("奇数\n");} else {printf("偶数\n");}// 输出结果:偶数2. 清零指定位通过与运算,我们可以将一个指定位置0,而不影响其他位的值。
比如将二进制数1010的第二位变为0,可以进行以下操作: int num = 10; // 1010int mask = ~(1 << 1);num = num & mask;printf("%d\n", num);// 输出结果:8二、或运算(|)或运算的运算规则如下:如果两个相应的二进制位有一个为1,则该位的结果值为1,否则为0。
1. 将指定位设置为1通过或运算,我们可以将一个指定位置1,而不影响其他位的值。
比如将二进制数1010的第三位变为1,可以进行以下操作: int num = 10; // 1010num = num | (1 << 2);printf("%d\n", num);// 输出结果:142. 设置多个位通过或运算,我们还可以设置多个指定位置1,比如将第一位和第三位都设置为1,可以进行以下操作:int num = 10; // 1010num = num | (1 << 0) | (1 << 2);printf("%d\n", num);// 输出结果:11三、异或运算(^)异或运算的运算规则如下:如果两个相应的二进制位值不同,则该位的结果值为1,否则为0。
单片机C51位运算应用技巧
位运算应用口诀: 清零取位要用与,某位置一可用或,若要取反和交换,轻轻松松用异或果也是整形。 2 3 >>右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位 补 0,若为负数,可能补 0 或补 1,这取决于所用的计算机系统。 4 >>>运算符,右边的位被挤掉,对于左边移出的空位一概补上 0。 位运算符的应用 (源操作数 s 掩码 mask) (1) 按位与-- & 1 (x|~y)-(~x&y) x = (x|y)-(x&y) x|y = (x&~y)+y
y – x; x – y; } (10)计算绝对值 int abs( int x ) { int y ; y = x >> 31 ; return (x)-y ; //or: (x+y) } (11)取模运算转化成位运算 (在不产生溢出的情况下):a % (2
x&y = (~x|y)-~x x==y: ~(x-y|y-x) x!=y: x-y|y-x xxxx 应用举例 (1) 判断 int 型变量 a 是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 (2) 取 int 型变量 a 的第 k 位 (k=0,1,2sizeof(int)),即 a>>k& (3) 将 int 型变量 a 的第 k 位清 0,即 a=a&~(1(4) 将 int 型变量 a 的第 k 位置 1, 即 a=a|(1(5) int 型变量循环左移 k 次,即 a=a(6) int 型变量 a 循环 右移 k 次,即 a=a>>k|a(7)整数的平均值 对于两个整数 x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可
如何使用位运算符进行二进制操作
如何使用位运算符进行二进制操作在计算机编程中,位运算符是一种十分重要的工具,它可以用来对二进制数进行各种操作。
通过位运算符,我们可以进行位与、位或、位异或、位取反等操作,这些操作能够在二进制数的每一位上进行逻辑运算,从而实现一些高效的编程技巧和算法。
首先,我们来了解一下位运算符的基本概念。
在计算机中,数据是以二进制形式存储和处理的,每个二进制位可以表示0或1。
位运算符就是对这些二进制位进行操作的符号。
常用的位运算符有以下几种:1. 位与(&):对两个二进制数的每一位进行与运算,只有当两个对应位都为1时,结果才为1,否则为0。
2. 位或(|):对两个二进制数的每一位进行或运算,只要两个对应位中有一个为1,结果就为1,否则为0。
3. 位异或(^):对两个二进制数的每一位进行异或运算,只有当两个对应位不相同时,结果才为1,否则为0。
4. 位取反(~):对一个二进制数的每一位进行取反运算,即0变为1,1变为0。
接下来,我们来看一些使用位运算符进行二进制操作的实例。
1. 清零操作:通过位与运算符,我们可以将一个二进制数的某些位清零。
例如,如果我们想将一个8位二进制数的低4位清零,可以使用以下代码: num = num & 0xF0;这里0xF0是一个只有高4位为1,低4位为0的二进制数,通过与运算,低4位就被清零了。
2. 位取反操作:通过位取反运算符,我们可以将一个二进制数的每一位取反。
例如,如果我们想将一个8位二进制数的每一位取反,可以使用以下代码: num = ~num;这样,原来的0变为1,1变为0。
3. 位异或操作:通过位异或运算符,我们可以对两个二进制数的每一位进行异或运算。
例如,如果我们想将一个8位二进制数的低4位与另一个8位二进制数的低4位进行异或运算,可以使用以下代码:num1 = num1 ^ (num2 & 0x0F);这里num2 & 0x0F是将num2的高4位清零,然后与num1的低4位进行异或运算。
经典位运算
位运算简介及实用技巧(一):基础篇什么是位运算?程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算说穿了,就是直接对整数在内存中的二进制位进行操作。
比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。
举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理):110AND 1011----------0010 --> 2由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
当然有人会说,这个快了有什么用,计算6 and 11没有什么实际意义啊。
这一系列的文章就将告诉你,位运算到底可以干什么,有些什么经典应用,以及如何用位运算优化你的程序。
Pascal和C中的位运算符号下面的a和b都是整数类型,则:C语言 | Pascal语言-------+-------------a &b | a and ba |b | a or ba ^b | a xor b~a | not aa <<b | a shl ba >>b | a shr b注意C中的逻辑运算和位运算符号是不同的。
520|1314=1834,但520||1314=1,因为逻辑运算时520和1314都相当于True。
同样的,!a和~a也是有区别的。
各种位运算的使用=== 1. and运算===and运算通常用于二进制取位操作,例如一个数and 1的结果就是取二进制的最末位。
这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.=== 2. or运算===or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。
如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(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) (设 sizeof(int)=16)
x< y: x<=y: x< y: x<=y: 应用举例
(x-y)^((x^y)&((x-y)^x)) (x|~y)&((x^y)|~(y-x)) (~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 奇数
二进制补码运算公式: -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: ~(x-y|y-x) x-y|y-x
位运算应用口诀 清零取位要用与,某位置一可用或 若要取反和交换,轻轻松松用异或 移位运算 要点 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 b=a1^b1^b1 a=b1^a1^a1 操 作 a=a^b b=a^b a=a^b 操作后状态 a=a1^b1,b=b1 a=a1^b1,b=a1 a=b1,b=a1
位运算:
复习了一下 c 语言的位运算,(经他人指点)发现位运算如果用的灵活的话,是个很方便的东西。下面简 单的介绍一下吧: 一、按位与(&); 1、运算规则: 1 & 0 = 0;0 & 1 = 0 ;0 & 0 = 0; 1 & 1 = 1; 2、特点: 与 0 运算结果为 0,与 1 运算结果保留原样; 3、举例; 3 & 5: 3: 0 0 0 0 0 0 1 1 5: (&)0 0 0 0 0 1 0 1 00000001 4、用途: ① 将某一位置 0,其他位不变。 例如: 将 char 型变量 a 的最低位置 0; a = a & 0376; =a&11111110 ② 去指定位。 例如: char c;short int a 取出 a 的低字节放在 c 中; c = a & 0377 =a & 00000000 11111111 ③ 进行“位屏蔽”运算 例子同上; ④ 通过 & 1 判断某个数的奇偶(这个要比%2 快) 例如: int i ; 若 i & 1 = 0 则 i 为 偶数; 若 i & 1 = 1 则 i 为 奇数。 二、按位或 (|) 1、运算规则: 1|0=1 ; 0|1=1 ; 1|1=1 ; 0|0=0 2、特点: 只要有一个 1 结果即为 1,否则结果为 0。 3、举例: 3 | 5: 3: 00000011 5: (|)0 0 0 0 0 1 0 1
00000111 4、用途: ① 将某一位置 1,其他位不变。 例如:将 short int 型变量 a 的低字节置 1 a = a | oxff = a | 00000000 11111111 三、按位异或 (^) 1、运算规则: 0 ^ 0 = 0; 1 ^ 1 = 0;0 ^ 1 = 1; 1 ^ 0 = 1 2、 2、特点: 若对应位相同,则结果为 0; 若对应位不同,则结果为 1。 3、举例: 3 ^ 5: 3: 0 0 0 0 0 0 1 1 5: (^)0 0 0 0 0 1 0 1 00000110 4、技巧: a ^ a = 0;a ^ 0 = a;a ^ 11……11 为翻转 5、用途 ① 使某些特定位翻转。 ② 下一篇博客(zoj 3432)会给出明确解释。 四、按位取反(~) 注意:~1 不是 -1 而是 -2; 五、左移运算 ( << ) 左移后低位补 0, 高位 舍弃。 六、右移运算 ( >> ) 右移后 低位舍弃 高位 无符号数 补 0 有符号数 补“符号位”
(6) int 型变量 a 循环右移 k 次,即 a=a>>k|a<<16-k (7)整数的平均值
ห้องสมุดไป่ตู้
对于两个整数 x,y, 如果用 (x+y)/2 求平均值, 会产生溢出, 因为 x+y 可能会大于 INT_MAX, 但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法: int average(int x, int 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 的平均值
x ^= y; y ^= x; x ^= y; } (10)计算绝对值 int abs( int x ) { int y ; y = x >> 31 ; return (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) 出处:/67350161.html //or: (x+y)^y