C语言位运算

合集下载

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;

C语言位运算

C语言位运算

第8章位运算C语言是为描述系统而设计的,与其它高级语言相比,它的一个重要特点是具有汇编语言的功能,这主要表现在C语言提供了特有的位运算功能。

8.1 位运算概念C语言的位运算是指在C语言中能进行二进制位的运算。

位运算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。

为了表示数值,可以采用不同的方法,一般有:原码、反码和补码。

计算机内部是以补码形式存放数值的。

8.2 位运算符C语言提供了六种位运算,如表8-1所示。

表8-1 位运算符及含义说明:1.位运算量a,b只能是整型或字符型的数据,不能为实型数据。

2.位运算符中除按位取反运算符~为单目运算符外,其它均为双目运算符,即要求运算符的两侧各有一个运算量。

8.2.1位逻辑运算符假设a,b为整型的数据,并且设a=123(等于二进制数00000000001111011),b=152(等于二进制数00000000010011000)1.“按位与”运算符&运算规则:参加运算的两个运算量,如果两个数相应位的值都是1,则该位的结果值为1,否则为0。

即:0 & 0 =0;0 & 1 =0;1 & 0 =0;1 & 1 =1。

【例8-1】a的补码:00000000001111011b的补码:00000000010011000& ————————结果的补码:00000000000011000即:a&b=0x18。

2.“按位或”运算符|运算规则:参加运算的两个运算量,如果两个数相应位的值都是0,则该位的结果值为0,否则为1。

即:0 | 0 =0;0 | 1 =1;1 | 0 =1;1 | 1 =1【例8-2】a的补码:00000000001111011b的补码:00000000010011000| ————————结果的补码:00000000011111011即:a|b=0xfb。

C语言中的位运算的技巧

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,则表⽰这个集合成员是不存在的。

C语言的位运算

C语言的位运算

C语言的位运算位运算是指按二进制进行的运算。

在系统软件中,常常需要处理二进制位的问题。

C语言提供了6个位操作运算符。

这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

C语言提供的位运算符列表:&,按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0|,按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1^ ,按位异或,若参加运算的两个二进制位值相同则为0,否则为1~ ,取反,~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0<<,左移,用来将一个数的各二进制位全部左移N位,右补0>>,右移,将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补01、“按位与”运算符(&)按位与是指:参加运算的两个数据,按二进制位进行“与”运算。

如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。

按位与其实与逻辑上“与”的运算规则一致。

逻辑上的“与”,要求运算数全真,结果才为真。

若,A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。

(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。

位是用以描述电脑数据量的最小单位。

二进制系统中,每个0或1就是一个位。

将11(2)补足成一个字节,则是00000011(2)。

5的二进制编码是101(2),将其补足成一个字节,则是00000101(2)按位与运算:00000011(2)&00000101(2)00000001(2)由此可知3&5=1c语言代码:#include <stdio.h>main(){int a=3;int b = 5;printf("%d",a&b);}按位与的用途:(1)清零若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数中为1的位,新数中相应位为0。

c语言位运算优先级

c语言位运算优先级

c语言位运算优先级C语言中的位运算是指对二进制数进行运算的操作。

位运算是一种快速且高效的运算方式,可以在一次计算中同时处理多个数位。

在C语言中,位运算具有特定的优先级,即不同的位运算符具有不同的执行顺序。

本文将重点介绍C语言中位运算的优先级及其使用方法。

在C语言中,位运算的优先级由高到低依次为:~(取反)、<<(左移)、>>(右移)、&(按位与)、^(按位异或)和|(按位或)。

位运算的优先级规定了在表达式中多个位运算符同时出现时的执行顺序。

下面将分别介绍各个位运算符及其优先级。

1. ~(取反)运算符:~是一元运算符,用于对一个数的每一位取反。

它的优先级最高,可以直接作用于一个数或表达式。

例如,~3的结果是-4,因为3的二进制表示为0000 0011,取反后为1111 1100,再转换为十进制即为-4。

2. <<(左移)和 >>(右移)运算符:<<是二元运算符,用于将一个数的二进制表示向左移动指定的位数,右边空出的位用0填充。

>>也是二元运算符,用于将一个数的二进制表示向右移动指定的位数,左边空出的位用符号位填充。

左移和右移运算符的优先级次于~运算符。

例如,8 << 2的结果是32,因为8的二进制表示为0000 1000,向左移动2位后变为0010 0000,即32。

3. &(按位与)运算符:&是二元运算符,用于对两个数的每一位进行与运算。

它的优先级次于<<和>>运算符。

例如,3 & 5的结果是1,因为3的二进制表示为0000 0011,5的二进制表示为0000 0101,按位与后得到0000 0001,即1。

4. ^(按位异或)运算符:^是二元运算符,用于对两个数的每一位进行异或运算。

它的优先级次于&运算符。

例如,3 ^ 5的结果是6,因为3的二进制表示为0000 0011,5的二进制表示为0000 0101,按位异或后得到0000 0110,即6。

C语言位运算

C语言位运算

位运算一、基本概念:1、概念:C语言提供了对二进制数中的某个位或某几位进行操作的运算符,称为位运算。

2、特点:不再将数据作为一个整体进行运算,而是对数据中的某个或某几个二进制位进行的运算。

3、用途:可直接用于编写系统程序,常用在检测和控制领域。

4、无符号数适用于只有正数和0的场合。

(可表示范围:0~2n-1)5、有符号纯整数的二进制表示有3种形式:(原码、反码、补码)(1)原码:如果用n位二进制表示一个数,用最高位表示符号,最高位为1表示负数,最高位为0表示正数,剩下的n-1位表示数值,数值部分用其绝对值表示,这种表示方法称为原码。

二进制原码的表示范围:-2n-1<x<2n-1。

例:十进制55D转换为二进制为:00110111B。

十进制-55D转换为二进制为:10110111B。

(2)反码:用n位二进制表示数据,仍然用最高位表示符号,1表示负,0表示正,剩下的n-1为表示数值(正数不做任何变换,保持不变,负数符号位不变其余各位按位取反(0变为1,1变为0)),这种表示方法称为反码。

(表示的数据范围与原码相同)例:十进制55D转换为二进制为:00110111B十进制-55D转换为二进制为:11001000B。

(3)补码:利用有模运算表示数据的一种方式。

如果用n位二进制表示数据,则系统的模是2n。

对任意一个范围在-2n-1≤x<2n-1的数X,其补码表示为:=2n+X。

[X]补例:十进制55D转换为二进制为:100000000+00110111=00110111B 十进制-55D转换为二进制为:100000000-00110111=11001000B二、位运算逻辑位运算符移位位运算符符号含义符号含义~按位取反(单目)<<左移(双目) &按位与(双目)|按位或(双目)>>右移(双目)∧按位异或(双目)1、按位与的作用:(1)全部清零:将一个需要全部清零的数与零做按位与运算。

《C语言程序设计》第十章位运算(完)

《C语言程序设计》第十章位运算(完)
}
运行结果: a and b:0x81 a and b:0xbb a and b:0x3a
1 0 1 1 1 0 0 1 a:0xb9 a&b 1 0 0 0 0 0 1 1 b:0x83
1 0 0 0 0 0 0 1 结果:0x81
1 0 1 1 1 0 0 1 a:0xb9 a|b 1 0 0 0 0 0 1 1 b:0x83
unsigned char b=248 b>>2 1 1 1 1 1 0 0 0
补零
00111110
舍弃
不带符号的操作数右移位时,左端出现的空 位补零。
unsigned char b=248 b>>2 1 1 1 1 1 0 0 0
补零
00111110
舍弃
说明:
4) 每右移一位相当于操作数除2。 5) a>>2,b>>2形式的操作并不改变操作数a,b
b=a<<2 舍弃
0 0 0 1 1 0 1 1 a:0x1b
0 1 1 0 1 1 0 0 b:0x6c 补零
不带符号的操作数右移位时,左端出现的空 位补零。
带符号的操作数右移位时,左端出现的空位 按原最左端的位复制,无论什么操作数,移 出右端的位被舍弃。
例[10-4]:右移位操作。
void main(){ char a=-8; unsigned char b=248; printf("signed a right_shift 2 bit:%d\n", a>>2 ); printf("unsigned b right_shift 2 bit:%d\n", b>>2 ); }

C语言位运算符(附例题讲解)

C语言位运算符(附例题讲解)

C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移12.1.1按位与运算按位与运算符"&"是双目运算符。

其功能是参与运算的两数各对应的二进位相与。

只有对应的两个二进位均为1时,结果位才为1,否则为0。

参与运算的数以补码方式出现。

例如:9&5可写算式如下:00001001 (9的二进制补码)&00000101 (5的二进制补码)00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。

例如把a 的高八位清0 ,保留低八位,可作a&255运算( 255 的二进制数为0000000011111111)。

【例12.1】main(){int a=9,b=5,c;c=a&b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}12.1.2按位或运算按位或运算符“|”是双目运算符。

其功能是参与运算的两数各对应的二进位相或。

只要对应的二个二进位有一个为1时,结果位就为1。

参与运算的两个数均以补码出现。

例如:9|5可写算式如下:00001001|0000010100001101 (十进制为13)可见9|5=13【例12.2】main(){int a=9,b=5,c;c=a|b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}12.1.3按位异或运算按位异或运算符“^”是双目运算符。

其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

参与运算数仍以补码出现,例如9^5可写成算式如下:00001001^0000010100001100 (十进制为12)【例12.3】main(){int a=9;a=a^5;printf("a=%d\n",a);}12.1.4求反运算求反运算符~为单目运算符,具有右结合性。

c语言位运算符

c语言位运算符

57 00111001
42 00101010
--------------------------------------------------------------------------------
∧: 00010011
57∧42=19
“异或”运算符(∧),也称XOR运算符
规定如下:
0∧0=0 0∧1=1 1∧0=1 1∧1=0
例:57∧42=?
将十进制数57与十进制数42进行按位异或运算。
位运算举例
例:取一个整数a从右端开始的4∽7位
考虑如下:1、先是a右移4位,即a>>4
2、设置一个低4位全为0的数,即∽(∽0<<4)
3、将上面两式进行与运算,即a>>4&∽(∽0<<4)
printf("%o\n%o\n",a,b);
}
结果:331↙
331(a的值,八进制)
15 (d的值,八进制)
位段
所谓位段是以位为单位定义长度的结构体类型中的成员。
例:struct packed-data
{unsigned a:2;
若a=15,即二进制数00001111,则
a 00001111
↓ ↓
a<<1 00011110
↓ ↓
a<<2 00111100
最后a=60
右移运算符(>>)
“取反”运算符(∽)
规定如下:
∽0=1 ∽1=0
例:∽025=?
对八进制数25(即二进制0000000000010101)按位求反。

C语言位运算符附例题讲解

C语言位运算符附例题讲解

C语言位运算符附例题讲解位运算符是计算机领域中常用的一种运算符,用于对二进制数进行位级别的操作。

C语言提供了一组位运算符,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。

本文将介绍这些位运算符,并通过一些例题来解释其使用方法。

一、按位与(&)按位与运算符用于将操作数的对应位进行与运算,只有当对应位都为1时,结果位才为1,否则为0。

例如,对于二进制数1010和1100进行按位与运算,结果是1000。

按位与运算常用于位掩码和清零操作。

例题1:求一个数的最后一位要求:给定一个非负整数n,求其二进制表示中最后一位的值。

输入: 6输出: 0解释: 6的二进制表示为110,最后一位为0。

解决方法:我们可以利用按位与运算符将n与1进行与运算,结果就是n的最后一位的值。

```c#include<stdio.h>int main() {int n;printf("请输入一个非负整数:");scanf("%d", &n);int last_bit = n & 1;printf("最后一位的值为:%d\n", last_bit);return 0;}```二、按位或(|)按位或运算符用于将操作数的对应位进行或运算,只要对应位中有一个为1,结果位就为1。

例如,对于二进制数1010和1100进行按位或运算,结果是1110。

按位或运算常用于设置位和合并操作。

例题2:将一个字节的高4位设置为1要求:给定一个字节(8位),将其高4位设置为1,低4位保持不变。

输入: 10110010输出: 11110010解决方法:我们可以利用按位或运算符将字节与0xF0进行或运算,其中0xF0表示高4位为1,低4位为0。

```c#include<stdio.h>int main() {unsigned char byte;printf("请输入一个字节(8位):");scanf("%hhu", &byte);byte = byte | 0xF0;printf("设置高4位为1后的结果:%d\n", byte);return 0;}```三、按位异或(^)按位异或运算符用于将操作数的对应位进行异或运算,对于对应位相同的情况,结果位为0,对于对应位不同的情况,结果位为1。

C语言中的位运算

C语言中的位运算
那么,sLowBits1 与 sLowBits2 有什么区别?
注意了,sLowBits1 和 sLowBits2 都是 short 型(而不是 unsigned short), 所以在这里,sLowBits1 代表一个正数值,而 sLowBits2 却代表了一个负数值(因 为 8 即是二进制 1000,sLowBits2 最高位是 1)。
///////////////////////////////////////////////// int main() { short sHighBits1 = 0x7fff; short sHighBits2 = 0x8f12; unsigned short usHighBits3 = 0xff12; short sLowBits1 = 0x7bcd; long lResult = 0;
[sHighBits1 + sLowBits1] lResult = 7fff7bcd lResult = 8f127bcd lResult = ff127bcd
嗯,运行很正确嘛……于是我们就放心的在自己的程序中使用起这个函数来 了。
可是忽然有一天,我们的一个程序无论如何结果都不对!经过 n 个小时的检 查和调试,最后终于追踪到……CatenateBits16() !?它的返回值居然是错的!!
前一次还好好的,后一次就 ffff 了?X 档案?
[X 档案的真相]:
注意那两个我们用来当作低 16 位值的 sLowBits1 和 sLowBits2。
已知: 使用 sLowBits1 = 0x7bcd 时,函数返回正确的值; 使用 sLowBits2 = 0x8bcd 时,函数中发生 X 档案。
lResult = CatenateBits16(sHighBits2, sLowBits1); printf("lResult = %08x ", lResult, lResult);

c的位运算

c的位运算

c的位运算
C的位运算是C语言中的一种操作,它主要用于对二进制数字进行运算。

C语言中的位运算符包括位与(&),位或(|),位异或(^),左移(<<),右移(>>)和取反(~)等。

这些位运算符可以用于对整数进行位操作,从而得到一些特定的结果。

例如,左移(<<)操作可以将一个数的二进制表示向左移动指定的位数,右移(>>)操作可以将一个数的二进制表示向右移动指定的位数,位与(&)操作可以将两个数的二进制表示中相应位置上的值进行逻辑与运算等。

这些位运算在编写一些特定的算法和系统程序时非常有用,可以提高程序的效率和性能。

- 1 -。

C语言位运算

C语言位运算
x 1011 1010 & 0000 0000 结果 0000 0000
取指定位 x = x & 0xf0 ; (高4位)
x 1011 1010 & 1111 0000 结果 1011 0000 保留指定位 x 01010100 & 00111011 结果 00010000
2.“按位或” 运算符 ( | )
(2) 用途: 与其它位运算配合使用。 a=a&~1——将最后一位置0
例如:main()
{ unsigned char a,b; a=0x9d; b=0xa5; printf(“~a: %x\n”, ~a); printf(“a&b: %x\n”,a&b); printf(“a | b: %x\n”,a | b); printf(“a^b: %x\n”,a^b);
}
输出结果: ~a: 62 a&b: 85 a | b: bd a^b: 38
5.“左移运算” 运算符 (<< ) (1)规则:
二进制数的各位依次左移,高位移走作废,低位补0
D7 D6 D5 D4 D3 D2 D1 D0
0
(2) 用途:对于一个无符号整数,若左移若干位后不溢 出(<=65535), 则每左移一位相当于原值乘2
x.c);
(1) 规则:两个运算量的相应位之间进行运算,两个
对应位中只要有一个为“1”时,结果就为“1”,
否则结果为“0”
0010 1010
| 1010 0011
(2) 用途:
结果 1010 1011
将数据中某些位置为1
x=x | 0x0f; (低4位置1)
x 1010 0101 | 0000 1111

c语言位运算详解

c语言位运算详解
右移3位 00 00 1 1 1 1 00 00 0 0 0 1
图11.2 15右移3位得到1
右移1位相当于该数除以2,右移n位相当于该数除以2 n , 因此,将15右移3位,相当于15/2 3 = 1(C语言规定整数相 除商为整数)。
右移时应注意符号问题。对于无符号数,右移时左端补0。 对于有符号数,若符号位为0(该数为正),则右移时左端 补0,同无符号数的处理。若符号位为1(该数为负),则右 移时左端是补0还是补1,取决于所用的计算机系统。有的系 统左端补0,称逻辑右移;左端补1,称算术右移。显然,两 种方式所得的结果是不一样的。Turbo C采用的是算术右移。
scanf (”%u” , & a ) ;
b=a >> 4 ; b=b & 0x000F; printf (” \na=%u b=%u ”, a , b ) ; } 运行情况如下: 115
a=115,b=7
例 2 循环移位。要求将一个无符号数进行左循环移位。如 图11. 4所示。将a左移1位,并将移出位补到右端,输入′e ′结束。
(4)重复以上步骤,直到有键按下。程序如下:
# include <stdio. h> main( ) { unsigned a ; int flag ; scanf (”%u” , & a ) ; while (getchar( ) !=’ e ’ )
{
flag=a & 0x8000 ; a=a<<1 ;
关于位段数据,注意以下几点: (1)一个位段必须存储在同一存储单元(即字)之中,不能跨两 个单元。如果其单元空间不够,则剩余空间不用,从下一个 单元起存放该位段。 (2)可以通过定义长度为0的位段的方式使下一位段从下一存 储单元开始。 (3)可以定义无名位段。 (4)位段的长度不能大于存储单元的长度。

C语言位操作运算详解

C语言位操作运算详解

位运算程序中的所有数在计算机内存中都是以二进制的形式储存的。

位本文会以C语言的交互环境来做代码演示常见的二进制位的变换操作and运算 &•判断奇偶数对于除0以外的任意数x,使用x&1==1作为逻辑判断即可if (x&1==1){}•判断某个二进制位是否为1比如第7位, 0x40转到二进制是0100 0000,代表第7位是1.if (n&0x40){//TODO:添加你要处理的代码}•字节读取(x >> 0) & 0x000000ff /* 获取第0个字节*/(x >> 8) & 0x000000ff /* 获取第1个字节*/(x >> 16) & 0x000000ff /* 获取第2个字节*/(x >> 24) & 0x000000ff /* 获取第3个字节*/•判断一个数是不是 22 的指数bool isPowerOfTwo(int n) {if (n <= 0) return false;return (n & (n - 1)) == 0;}•取余//得到余数int Yu(int num,int n){int i = 1 << n;return num&(i-1);}•指定二进制位数截取比如说16位二进制数A:1001 1001 1001 1000,如果来你想获A 的哪一位的值,就把数字B:0000 0000 0000 0000的那一位设置为1.比如说我想获得A的第三位就把B的第三位数字设置为1,则B为0000 0000 0000 0100,设置完之后再把A、B求与,其结果若为0,说明A的第三位为0,其结果为1,说明A的第三位为1.同理:若要获得A的第五位,就把B设置为0000 0000 0001 0000,之后再求与。

通常在我们的程序中,数字B被称为掩码,其含义是专门用来测试某一位是否为0的数值。

c语言位运算

c语言位运算

c语言位运算
1.右移>>运算:
移位运算符">>"是右移,左边舍弃,右边补0的运算。

如操作数是1011101,右移2位,结果就是0011101。

2.左移<<运算:
移位运算符"<<"是左移,右边舍弃,左边补0的运算。

如操作数是1011101,左移2位,结果就是11010100。

3.&与运算
&:位与运算,对应位同时为1时,其结果为1,其他情况结果为0。

如操作数是1011101,011,两者进行&运算得到结果001;
4.|或运算
|:位或运算,对应位有一个为1,其结果为1,其他情况结果为0。

如操作数是1011101,011,两者进行|运算得到结果1011111。

5.~非运算
~:位非运算,对应位取反,0变1,1变0。

如操作数是1011101,两者进行~运算得到结果0100010。

C语言第12章位运算法则

C语言第12章位运算法则
本章要求 1、位运算及其特殊用途。 2、信息的位段表示。
第 12 章 位运算 1/5
第 12 章 位运算
位运算: 是指对二进制按位进行运算。如:将一个二进制的位左移或右移,两个二进制数相加 等。
12.1 位运算
C 语言提供的位运算符: & 按位与 | 按位或 ∧ 按位异或 ~ 取反 << 左移 >> 右移
b=a<<(16-n);
c=a>>n;
cபைடு நூலகம்c|b;
printf(“%o\n%o”,a,c);
}
12.3 位域(位段)
信息可以用 1 字节、2 字节、4 字节、8 字节表示。 例如,用 1 字节表示一个英文字符,2 字节表示一个汉字字符,4 字节表示一个实数,....等。
第 12 章 位运算 4/5
|=, 例:a|=b 相当于 a=a|b
>>=, 例:a >>=b 相当于 a=a>>b
<<=, 例:a<<=b 相当于 a=a<<b
∧=, 例:a∧=b a = a∧b
12.2 位运算举例
例[12.1] 取一个整数 a 从右端开始的 4~7 位。 比如,
第 12 章 位运算 3/5
0000,0000,1101,1001(16 位二进制) 方法: (1) 先使 a 右移 4 位,使要取出的几位移到最右端。a>>4 (2) 设置一个低 4 位全为 1,其余为 0 的数
二、“按位或”运算符 规则: 参加运算的两个运算量,如果两个对应位中有 1,则 该位结果值为 1,否则为 0。 例如 X=10001001 Y=11101110

c语言位运算^

c语言位运算^

c语言位运算^
在C语言中,位运算 ^ 表示按位异或(XOR)操作。

按位异或是一种二进制运算,它对两个二进制数的每一位进行比较,如果相应位不同,则结果为1;如果相应位相同,则结果为0。

以下是 ^ 按位异或操作的示例:
#include <stdio.h>
int main() {
// 示例1: 按位异或操作
unsigned int a = 5; // 二进制表示为 0101
unsigned int b = 3; // 二进制表示为 0011
unsigned int result = a ^ b; // 按位异或操作
printf("a ^ b = %u\n", result); // 输出结果:6(二进制表示为 0110)
// 示例2: 利用异或进行变量交换
int x = 10;
int y = 20;
x = x ^ y;
y = x ^ y;
x = x ^ y;
printf("After swapping: x = %d, y = %d\n", x, y);
return 0;
}
在示例1中,a ^ b 的结果是按位异或操作,得到6。

在示例2中,利用异或进行了两个变量的交换。

这是因为异或具有自反性,即a ^ b ^ b 的结果等于 a,所以可以通过异或操作实现两个变量的值互换。

请注意,异或操作是一种常用的位运算,可用于一些特定的算法和技巧,例如在密码学中的应用。

C语言中的位操作与位运算

C语言中的位操作与位运算

C语言中的位操作与位运算位操作和位运算是C语言中常用的编程技术,它们通过直接操作变量的位来实现一些特定功能和优化程序性能。

本文将介绍C语言中的位操作与位运算,并探讨其在实际编程中的应用。

一、位操作概述位操作是通过改变变量中的独立的二进制位来实现特定功能的操作。

在C语言中,位操作主要包括位与(&)、位或(|)、位异或(^)、位取反(~)等操作符。

1. 位与(&)操作符位与操作符用于将两个操作数的对应位进行与运算,只有当两个位都为1时,结果位才为1,否则结果位为0。

例如,当我们需要提取一个变量的特定位时,可以通过使用位与操作符来屏蔽其他位,只保留我们需要的那一位。

2. 位或(|)操作符位或操作符用于将两个操作数的对应位进行或运算,只要两个位中有任意一个为1,结果位就为1。

位或操作通常用于设置一个或多个特定位的值为1,或者将多个变量的特定位合并为一个变量。

3. 位异或(^)操作符位异或操作符用于将两个操作数的对应位进行异或运算,当两个位不相同时,结果位为1,否则结果位为0。

位异或操作通常用于交换两个值、翻转指定位的值等。

4. 位取反(~)操作符位取反操作符用于将操作数的每个位取反,即1变为0,0变为1。

位取反操作通常用于取反一个变量的所有位。

二、位运算概述位运算是通过对二进制数进行逻辑操作来实现特定功能的运算。

在C语言中,常用的位运算包括左移运算(<<)、右移运算(>>)、按位取反(~)运算。

1. 左移运算(<<)左移运算符用于将操作数中的各个位向左移动指定的位数。

左移时,低位补0。

左移运算通常用于实现对变量进行乘以2的n次方的操作。

2. 右移运算(>>)右移运算符用于将操作数中的各个位向右移动指定的位数。

右移时,高位补0(对于无符号数)或补符号位(对于有符号数)。

右移运算通常用于实现对变量进行除以2的n次方的操作。

3. 按位取反(~)按位取反运算符用于将操作数的每个位取反。

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

C语言位运算
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__。

相关文档
最新文档