算术操作符
#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;
}