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语言操作符详解的主要内容,如果未能解决你的问题,请参考以下文章

20160206.CCPP体系详解(0016天)

C语言 操作符详解

C语言代码片段

C语言基础学习笔记五操作符详解(详细讲解+练习巩固+记忆总结)

20160206.CCPP体系详解(0016天)

顺序表详解及其c语言代码实现