位运算(针对整型、字符型,计算机会将它转换为二进制运算)
1、按位与:x&y 对应位都为1时才为1
用途:取、保留1个数的某位(对应掩码的对应位为1),其余各位置1
2、按位或:x|y 对应位都为0才为0,否则为1
用途:将1个数的某些位置1,其余不变
3、按位异或:x^y 对应位相同为0,不同为1
用途:使1个数某些位取反
4、按位取反:~x
用途:间接构造一个数,增强可移植性
5、按位左移:x<< 各位左移,低位补0,高位溢出
6、按位左移:x>> 各位右移,移出的低位舍弃
高位:(1)对无符号数和有符号中的正数补0
(2)有符号的负数,取决于系统,补0的称为“逻辑右移”,补1的称为“算术右移”
程序应用:
1、请编写一个c函数,该函数给出一个字节中被置为1的位的个数
#include <stdio.h> int main() { int i,mask; char ch; int len=0; printf("Enter a character: "); scanf("%c",&ch); mask = 1 <<7; printf("%c=",ch); for(i = 1;i <= 8;i++) { putchar(ch & mask ? '1' : '0'); if(ch & mask ? '1' : '0' == '1') { len++; } ch <<= 1; if(i == 4) putchar(','); } printf("\n"); printf("%d\n",len); return 0; }
注意:mask = 1 <<7; putchar(ch & mask ? '1' : '0');ch <<= 1;的应用
2、输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
#include <stdio.h> int main() { int a,p1,p2; int mask; int i; printf("Enter a interger: a="); scanf("%d",&a); printf("Enter two intergers(p1<p2<32): "); scanf("%d%d",&p1,&p2); printf("new_a="); mask = ~(~0 << p1); for(i = p1;i <= p2;i++) { putchar(a & mask ? '1' : '0'); a >>= 1; if(i % 4 == 0) putchar(','); } printf("\n"); return 0; }
注意:mask = ~(~0 << p1);的应用
