位运算(针对整型、字符型,计算机会将它转换为二进制运算)
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);的应用