位运算

2011年11月17日 发表评论 阅读评论

一、位的概念
???? 我们知道,在计算机中,一字节占8位(现在的某些电脑也有占16位的),这样表示的数的范围为0-255,也即00000000-11111111。位就是里面的0和1。
???????? char c=100;
???? 实际上c应该是01100100,正好是64H。其中高位在前,低位在后。(不足位数的在值前补0)

????????????????? |?????? |
??????????????? 第7位?? 第0位

二、位逻辑运算符

???????? 符号????????? 描述
????????? &??????????? 位逻辑与
????????? |??????????? 位逻辑或
????????? ^??????????? 位逻辑异或
????????? ~??????????? 取补
??

表中除去最后一个运算符是单目运算符,其他都是双目运算符。这些运算符只能用于整型表达式。位逻辑运算符通常用于对整型变量进行位的设置、清零、取反、以及对某些选定的位进行检测。在程序中一般被程序员用来作为开关标志。较低层次的硬件设备驱动程序,经常需要对输入输出设备进行位操作。?位操作符一共有6种,分别是按位与,按位或,按位异或,取反,左移,右移。?

????????? & 运算的规则是当两个位都为1时,结果为1,否则为0;
????????? | 运算的规则是当两个位都为0时,结果为0,否则为1;
????????? ^ 运算的规则是当两个位相同时,结果为0,否则为1;
????????? ~ 运算的规则是当为1时结果为0,当为0时,结果为1。
注意:异或的另类特点,任何和1异或就是把自己给反转了!还有个可以用到的地方,就是写一个2个变量之间的值交换,可以用按位异或。这样就省去了一个中间变量。如:
#included<stdio.h>
int main()
{??? int a = 1;
???? int b = 2;
???? a = a ^ b;
???? b = b ^ a;
???? a = a ^ b;
???? printf("%d,%d",a,b);??? /*结果为a,b的值交换。*/
}
???? 设置位:设置某位为1,而其他位保持不变,可以使用位逻辑或运算。
???????? char c;
???????? c=c|0x40;
???? 这样不论c原先是多少,和01000000或以后,总能使第6位为1,而其他位不变。

???? 清除位:设置某位为0,而其他位保持不变。可以使用位逻辑与运算。
???????? c=c&0xBF;
???? 这样c和10111111与以后,总能使第6位为0,其他位保持不变。
???? 那如果想让某位为1,其他位都为0怎么办呢?

例子:

#include<stdio.h>
int main()
{??? int x = 2002;?
??? x = x & 0;????
??? printf("%drn", x);
}?

三、位移运算符
????????? 符号????????????? 描述
?????????? <<?????????????? 左移
?????????? >>?????????????? 右移

???? 位移运算符作用于其左侧的变量,其右侧的表达式的值就是移动的位数,运算结果就是移动后的变量结果。
???????? b=a<<2;
???? 就是a的值左移两位并赋值为b。a本身的值并没有改变。
????????????????
???? 向左移位就是在低位补0,向右移位就是在高位上补0。右移时可以保持结果的符号位,也就是右移时,如果最高位为1,是符号位,则补1而不是补0。
???? 程序员常常对右移运算符来实现整数除法运算,对左移运算符来实现整数乘法运算。其中用来实现乘法和除法的因子必须是2的幂次。

???? 举例:输入一个整数,判断这个数中有几个二进制位1?例如输入67,输出结果应该为3。因为67的相应二进制数为00000000 01000011(0043H),有3个1出现。

分析:要判断是不是1,只需要判断该位与1与以后是不是1就可以知道。一个整数,判断16次即可。

???????? main()
???????? {
???????????? int num,k;
???????????? int count=0;??????????????? /* 记录1的个数 */
???????????? scanf("%d",&num);
???????????? for(k=0;k<16;k++)
???????????? {
???????????????? if(num&1==1) count++;???? /* 判断最低位是不是1 */
???????????????? num>>=1;????????????????? /* num右移1位 */
???????????? }
???????????? printf("%dn",count);
???????? }

???? 这样每次都判断最低位是不是1,判断完以后,让前面的右移一位即可。

main()
???? {
????????? char m, n;???? /*定义字符型变量*/
????????? m='c';???????? /*给m赋小写字母'c'*/
????????? n=m+'A'-'a';?? /*将c中的小写字母变成大写字母'B'后赋给n*/
????????? ...
???? }
??? 上例中m='c'即m=98, 由于字母A和a的ASCII码值分别为65和97。这样可以将
小写字母变成大写字母, 反之, 如果要将大写字母变成小写字母, 则用c+ 'a'
-'A'进行计算。

sizeof运算符
??? sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。
??? 例如:
???? sizeof(double) 为8
???? sizeof(int)??? 为2
??? 也可以求已定义的变量, 例如:
???? float f;
???? int i;
???? i=sizeof(f);
??? 则i的值将为4




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: C/C++/Java/Delphi 标签:
  1. 本文目前尚无任何评论.