1、简介:
C语言是为描述系统设计的,因此它应该具有汇编语言所有完成的一些功能。C语言既有高级语言的特点,又具有低级语言的功能。因而具有广泛的用途和很强的生命力。
2、位运算符合位运算
运算符 含义
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移
>> 右移
说明:(1)位运算符中除了~之外,均为二目运算符,即要求两侧各有一个运算量。
(2)运算量只能是整形或字符型的数据,不能为实型数据。
3、“按位与” 运算符 (&)
参加运算的两个数字,按二进制进行 “与” 运算。如果两个相对应的二进位数为1,刚该位的结果为 1,否则为 0。 即:
0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1& 1 = 1
例如:3 & 8 并不等于8,应该是按位与
3 = 00000011
&
5 = 00000101
= 0000001
因此 3 & 5 的值得 1, 如果参加 & 是负数(-3 & -5),则以补码形式表示为二进制数。然后按位进行”与“运算。
按拉与有一些特殊的用途:
(1)清零。如果想将一个单元清零,即其全部二进位置为 0,只要找一个二进制数,其中各个二进位符合以下条件:原来数中为 1 的位,新数中相应位为 0。然后使二者进行 & 运算,即可以达到清零目的。
(2)取一个数中某些指定位。如有一个整数 a (2个字节)想要其中的低字节。只需将 a 与(337)。按位与即可。
(3)要想将哪一个保留下来,就与一个数进行 & 运算,此数在该位位1,如有一个数 01010100,想把其中左面第3,4,5,7,8可以这样运算:
01010100
&
00111011
=
00010000
4、“按位或” 运算符 (|)
两个相对应的二进位中只要有一个为1,该位的结果就位1.
0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1;
5、“按位异或” 运算符 (^)
按位异或运算符 ^ 也成XOR运算符,它的规则是参见运算的两个二进位同号,则结果为0,异号则为1.
0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 0;
下面举例说明 ^ 运算符的应用。
(1)使特定位翻转
假设有 0111 1010, 想使其低4位翻转,即1变为0,0变为1,可以将它与0000 1111 进行^运算。
0111 1010
^ 0000 1111
= 0111 0101
(2)交换两个值,不用临时变量
假如 a = 3, b = 4。交换 a和b 的值
转二进制:a= 011,b = 100
a = a^b a = a^b 011 b = a^b 111 a = a^b 111
b = a^b ^ 100 ^ 100 ^ 011
a = a^b = 111 b = 011 a = 100
转十进制:a = 4, b = 3.
6、“按位取反” 运算符 (~)
~是单目运算符,用来对一个二进制按位取反,即 将0变1,将1变0.
~ 0101 = 1010
7、“左移” 运算符 (<<)
用来将一个二进位全部左移若干位。 如:
a = a << 2
将a的二进制数左移2位,右补0,。
若 a = 15,即二进制数 0000 1111, 左移两位得到 0011 1111,即10进制的60.
注:高位左移后溢出,则直接舍弃,不起作用。
左移一位相当于该数乘以2,但是该结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。左移运算要比乘法运算快的多,有些C编译程序自动将乘2的运算用左移来实现。
8、“右移” 运算符 (>>)
用来将一个二进位全部左移若干位。右端溢出的位被舍弃在右移时,需要注意符号位问题。对无符号数据,右移时,左端空出的位用0补充。对于带符号
的数据,如果移位前符号位为0(正数),则左端也是用0补充;如果移位前符号位为1(负数),则左端用0或用1补充,取决于计算机系统。对于负数右移,称用0补
充的系统为“逻辑右移”,用1补充的系统为“算术右移”。以下代码能说明读者上机的系统所采用的右移方法:
printf("%d\n\n\n", -2>>4); 若输出结果为-1,是采用算术右移;输出结果为一个大整数,则为逻辑右移。
9、不同长度的数据进行位运算
如果两个数据长度不同(如:long型和int型)进行位运算时。
如:a为long型,b为int型 a&b
系统会将二者按右端对齐,如果b位正数,则左侧16位补满0,若b为负数,左侧应补满1。如果b位无符号整形,则左侧应补满0.