C语言操作符详解
Posted 不倒翁*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言操作符详解相关的知识,希望对你有一定的参考价值。
C语言操作符详解
1C语言位操作符
1.1右移操作符 >>
右移操作符包括下面两种
1.算术右移
右边丢弃,左边补原符号位(常用这种)
2. 逻辑右移
右边丢弃,左边补0
注:右移有相当于除以2的效果
int main()
{
//整数的二进制有:源码,反码,补码
//正数的二进制源码反码补码相同
//储存到内存的是补码,移位操作的是二进制中的补码
int a=16;
//源码为:00000000 00000000 00000000 00010000 首位0代表正数
int b= a>>1;
//右移一位后b为:00000000 00000000 00000000 00001000
printf("b=%d",b); //b等于8 右移有相当于除以2的效果
int a=-1;
//源码为:10000000 00000000 00000000 00000001 首位1代表负数
//反码为:11111111 11111111 11111111 11111110
//补码为:11111111 11111111 11111111 11111111 补码=反码加1
int b=a>>1;
printf("b=%d",b); //b=-1
return 0;
}
1.2 左移操作符 <<
左移操作符一般操作方法为:左边丢弃,右边补0 。
注:左移有相当于乘以2的效果
int a=5;
int b =a<<1;
printf("b=%d",b); //b=10 左移有相当于乘以2的效果
1.3 位操作符(& | ^)
& 按位与操作符 (全1为1,有0则为0)
| 按位或操作符 (有一个数为1就为1,全0为0)
^ 按位异或 (相同为0,不同为1)
注:他们的操作数必须是整数
int main()
{
//&
int a=3;
int b=5;
int c=a&b;
printf("c=%d",c); //c=1
//a:00000000 00000000 00000011
//b:00000000 00000000 00000101
//c:00000000 00000000 00000001
// |
int a=3;
int b=5;
int c=a|b;
printf("c=%d",c); //c=7
//a:00000000 00000000 00000011
//b:00000000 00000000 00000101
//c:00000000 00000000 00000111
// ^
//相同为0,不同为1
int a=3;
int b=5;
int c=a^b;
printf("c=%d",c); //c=6
//a:00000000 00000000 00000011
//b:00000000 00000000 00000101
//c:00000000 00000000 00000110
return 0;
}
下面可以看使用位操作的两道常见面试题:
1.不能创建第三个变量,实现两数的交换
计算一个整数储存在内存中的1 的个数
#include <stdio.h>
int main()
{
int a=3; //011
int b=5; //101
a=a^b; //110
b=a^b; //011
a=a^b; //101
printf("a=%d,b=%d\\n",a,b);
return 0;
}
上面那道题就是利用了异或的方法解决了两个数字的互换。
2.计算一个整数储存在内存中的1 的个数
#include<stdio.h>
int main()
{
int num=0;
int count=0;
scanf("%d",&num);
/* 注释的这种方法当 num为负数时有问题
//所以我们可以用下面那种方法
while(num)
{
if(num%2==1)
count++;
num=num/2;
}*/
for(i=0;i<32;i++)
{
if ( (num>>i) &1) == 1) //判断是否为1
count++;
}
printf("count=%d\\n",count);
return 0;
}
1.4sizeof操作符
sizeof() 是一个判断数据类型或者表达式长度的运算符
#include <stdio.h>
int main()
{
short s=0; //短整型 两个字节
int a=10;
printf("%d",sizeof(s=a+5)); //值为2 只看s的类型
printf("%d",s); //值为0 sizeof里面的表达式不做运算
return 0;
}
#include <stdio.h>
void test1(int arr[])
{
printf("%d",sizeof(arr));
}
void test2(char ch[])
{
printf("%d",sizeof(ch));
}
int main ()
{
int arr[10]={0};
char ch[10]={0};
printf("%d",sizeof(arr)); //40 一个整型数据占4个字节
printf("%d",sizeof(ch)); //10 一个char类型占1个字节
test1(arr); //4
test2(ch); //4 后两个相当于计算指针的大小 指针大小为4或8
return 0;
}
1.5 ~ 按位取反
取反是对存放在内存中的补码的二进制数全部取反
#include <stdio.h>
int main
{
int a=0;
printf("%d",~a); //值为-1 打印是打印原码的值
//源码:00000000000000000000000000000000 (a的源码,补码和反码,取反是对补码进行操作)
//取反后a的补码:11111111111111111111111111111111 (放在内存中~a)
//取反后a反码:11111111111111111111111111111110 (反码等于补码减1)
//取反后a源码:10000000000000000000000000000001 (等于-1)
return 0;
}
#include <stdio.h>
{
int a=11;
a=a|(1<<2);
printf("%d",a); //a=15
//00000000000000000000000000001011 (把第三位的0转成1)
//00000000000000000000000000000100
a=a&(~(1<<2)); //变回原来的数
//00000000000000000000000000000100
//11111111111111111111111111111011
//00000000000000000000000000001011
//00000000000000000000000000001011
printf("%d",a); //a=11
return 0;
}
总结不易,希望对你有帮助的话可以点个关注
以上是关于C语言操作符详解的主要内容,如果未能解决你的问题,请参考以下文章