算术操作符 移位操作符 原码反码补码 位操作符 按位与& 按位或| 按位异或^ 复合操作符 单目操作符 !逻辑反操作 &取地址操作符 sizeof计算变量所占空间大小单位字节

算术操作符

#include<stdio.h>
int main()
{
    
    
	int a = 5 / 2;//商2余数1 
	int a = 5 % 2;//%的结果是余数1
	printf("a = %d\n", a);
	return 0;
}

移位操作符 原码 反码 和补码

右移操作符 算术右移 右边丢弃,左边补原符号位,1表示负数
0表示正数
左移操作符 左边丢弃,右边补0
注意:它们的操作数必须都是整数

#include<stdio.h>
int main()
{
    
    
	int a = -1;
	//整数的二进制表示有:原码,反码,补码
	//存储到内存的是补码
	//整数的原码 = 反码 = 补码
	//1000 0000 0000 0000 0000 0000 0000 0001 ---原码
	//1111 1111 1111 1111 1111 1111 1111 1110 ---反码
	//1111 1111 1111 1111 1111 1111 1111 1111 ---补码
	int b = a >> 1;//这里是指将a的二进制位向右移动一个,也就是将补码移动一个
	//1111 1111 1111 1111 1111 1111 1111 1111--- 补码      移动完了之后的
	//1111 1111 1111 1111 1111 1111 1111 1110--- 反码
	//1000 0000 0000 0000 0000 0000 0000 0001 --- 原码
	int c = 5;
	//0000 0000 0000 0000 0000 0000 0000 0101 --原码 反码 补码相同
	//0000 0000 0000 0000 0000 0000 0000 1010 左移动之后十进制是10
	int d = c << 1;
	printf("d==%d\n", d);
	printf("b =%d\n", b);
	return 0;
}

位操作符

二进制 位操作符
& 按位与
| 按位或
^ 按位异或
注意:它们的操作数必须都是整数
&按二进制 位与 二进制位相比较,只要有一个是0那么都是0

按位与 &

#include<stdio.h>
int main()
{
    
    
	//&按位与   二进制位相比较,只要有一个是0那么都是0
	int a = 3;
	int b = 5;
	int c = a&b;
	//a  0000 0000 0000 0000 0000 0000 0000 0011
	//b  0000 0000 0000 0000 0000 0000 0000 0101
   //a&b 0000 0000 0000 0000 0000 0000 0000 0001  所以结果就是1
	printf("%d\n", c);
	return 0;
}

| 按位或

按二进制位或 | 只要有一个位1那么都是1

#include<stdio.h>
int main()
{
    
    
	//按位或 | 只要有一个位1那么都是1
	int a = 3;
	int b = 5;
	int c = a | b;
	// a  0000 0000 0000 0000 0000 0000 0000 0011
	// b  0000 0000 0000 0000 0000 0000 0000 0101
  //a|b   0000 0000 0000 0000 0000 0000 0000 0111  结果就是7
	printf("%d\n", c);
	return 0;
}

^ 按位异或

按位异或 ^ 按二进制相比较 相同位0 相异位1

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;	
	int c = a^b;
	//按位异或 ^ 按二进制相比较 相同位0 相异位1
	//a 0000 0000 0000 0000 0000 0000 0000 0011
	//b 0000 0000 0000 0000 0000 0000 0000 0101
  //a^b 0000 0000 0000 0000 0000 0000 0000 0110  a^b 只要右两个相等的就是0 不相等就是1 结果是6
	printf("%d\n", c);
	return 0;
}

位操作符总体训练

#include<stdio.h>
int main()
{
    
    
	int num1 = 1;
	int num2 = 2;
	int c = num1 & num2;
	int d = num1 | num2;
	int e = num1 ^ num2;
	// 001   c: 000  d: 011 e:011 0 3 3
	// 010  
	printf("%d%d%d\n", c, d, e);
	return 0;
}

一道变态的面试题

不能创建临时变量(第三个变量),实现两个数的交换
a=3,b=5; 交换之后 a=5;b=3;

#include<stdio.h>
int main()
/*一道变态的面试题:
不能创建临时变量(第三个变量),实现两个数的交换
a=3,b=5; 交换之后 a=5;b=3;
/*
{
	/* 加减法 
	有缺陷,因为两个整型数值太大的时候 超出范围就会有些数值丢失
	那么这个时候a里面放的就不是和了
	可能会溢出
	int a = 3;
	int b = 5;
	a = a + b; 
	b = a - b;
	a = a - b;
	printf("a = %d b = %d\n", a, b);
	*/
	int a = 3;
	int b = 5;	
	a = a ^ b;
	/*这里的a和b
		a  011
		b  101
	 a^b = 110     a也就是6
	*/
	b = a ^ b;
	/*这里的a和b
		a 110
		b 101
	  a^b 011      b就是3 a还是6
	*/
	a = a ^ b;
	/* 这里的a和b
		a 110
		b 011
      a^b 101      a就是5 b就是3
	*/
	printf("a=%d b=%d\n", a, b);
	return 0;
}

求一个整数存储在内存中的二进制中1的个数判断二进制中1的个数

#include<stdio.h>
int main()
{
    
    
	int num = 0;
	int count = 0;
	scanf("%d", &num);
	int i = 0;
	for (i = 0; i < 32; i++)
	{
    
    
		if (1 == ((num >> i) & 1))
			count++;
	}
	printf("count = %d\n", count);
	return 0;
}

复合操作符

#include<stdio.h>
int main()
{
    
    
	int a = 0;

	a = a + 2;
	a += 2;

	a = a >> 1;
	a >>= 1;

	a = a & 1;
	a &= 1;


	return 0;
}

单目操作符

 !	逻辑反操作
 -	负值
 +	正值
 &	取地址
sizeof 操作数的类型长度(以字节为单位)
 ~  对一个数的二进制按位取反
--   前置,后置--
++   前置,后置++
*    间接访问操作符(解引用操作符)

!逻辑反操作 真的变成假,假的变成真

int main()
{
    
    
	//! 逻辑反操作  真变成假 假变成真  0为假非0就是真
	int a = 0;
	if (!a)//a为假 就变成真 打印呵呵
	{
    
    
		printf("呵呵\n");
	}
	return 0;
}

&取地址操作符 *解引用操作符

int main()
{
    
    
	//&取地址操作符
	int a = 10;
	int* p = &a;//&取地址操作符  
	*p;//*解引用操作符 找到p所指向的对象
	return 0;
}

sizeof 计算变量所占空间大小,单位字节

int main()
{
    
    
	int a = 10;
	char c = 'r';
	char* p = &c;
	int arr[10] = {
    
     0 };
	//sizeof计算的是变量所占内存空间的大小,单位是字节
	printf("%d\n", sizeof(a));//4
	printf("%d\n", sizeof(int));//4

	printf("%d\n", sizeof(c));//1
	printf("%d\n", sizeof(char));//1

	printf("%d\n", sizeof(p));//指针大小32为就是64位就是8
	printf("%d\n", sizeof(char*));//指针大小32为就是64位就是8

	printf("%d\n", sizeof(arr));//40
	printf("%d\n", sizeof(int [10]));//40 数组类型就是把数组名去掉

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52495715/article/details/119860818