算术操作符
+ - * /
移位操作符
1.<< 左移操作符
二进制位左移
int a = 1;
int b = a << 1;
printf("b = %d", b);
运行结果:
b = 2
2.>> 右移操作符
二进制位右移
int a = 1;
int b = a >> 1;
printf("b = %d", b);
运行结果:
b = 0
tip: 右移分为算术右移和逻辑右移
算术右移:右边丢弃,左边补原符号位
逻辑右移:右边丢弃,左边补0
3.& 按位与操作符
二进制位与(相同二进制位都为1才得1)
int a = 3;//00000000000000000000000000000011
int b = 5;//00000000000000000000000000000101
int c = a & b;//00000000000000000000000000000001
printf("c = %d", c);
运行结果:
c = 1
4.| 按位或操作符
二进制按位或(相同二进制位有1则得1)
int a = 3;//00000000000000000000000000000011
int b = 5;//00000000000000000000000000000101
int c = a | b;//00000000000000000000000000000111
printf("c = %d", c);
运行结果:
c = 7
5. ^ 按位异或操作符
二进制位异或(相同为0,相异为1)
int a = 3;//00000000000000000000000000000011
int b = 5;//00000000000000000000000000000101
int c = a ^ b;//00000000000000000000000000000110
printf("c = %d", c);
运行结果:
c = 6
tip:3、4、5操作符只能作用于整数
内存存放规则
分为三种码存放:原码、反码、补码
原码: 直接根据数据写出的二进制序列就是原码
反码: 原码的符号位不变,其他位按位取反就是反码
补码: 反码+1就是补码
例:
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
负数的符号位为1,正数为0
正整数原码、反码、补码相同
逻辑操作符
1. && 逻辑与
第一个为0,后面不用计算
2. || 逻辑或
第一个为非0,后面不用计算
条件操作符
? :
例:
a = 3;
b = (a > 5 ? 1 : -1);
printf("%d", b);
结果:
-1
逗号表达式
从左向右依次计算,但是整个表达式的结果是最后一个表达式的结果
结构成员访问操作符
. ->
结构体
struct Book
{
//结构体成员
char name[20];
char id[20];
int price;
};//分号不能省略!!!
.调用:
int main()
{
int num = 10;
struct Book b = {"C语言","2023","55"};
printf("%s %s %d", b.name, b.id, b.price);
return 0;
}
运行结果:
C语言 2023 55
->调用:
int main()
{
int num = 10;
struct Book b = {"C语言","2023","55"};
struct Book* pb = &b;
printf("%s %s %d", pb->name, pb->id, pb->price);
return 0;
}
运行结果:
C语言 2023 55
例题
- 写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
// 返回 1的位数
}
程序:
#include<stdio.h>
int count_one_bits(unsigned int n)
{
int count = 0;
for (int i = 0; i < 32; i++)
{
if (n & 1 == 1)
count++;
n = n >> 1;
}
return count;
}
int main()
{
int n = 15;
printf("%d ", count_one_bits(n));
return 0;
}
- 获取一个数二进制序列中所有的偶数位和奇数位,
分别输出二进制序列。
程序:
#include<stdio.h>
void count_one_bits(unsigned int n)
{
int m = 0;
for (int i = 31; i >= 0; i -= 2)
{
m = n >> i;
printf("%d ", m & 1);
}
printf("\n");
for (int i = 30; i >= 0; i -= 2)
{
m = n >> i;
printf("%d ", m & 1);
}
}
int main()
{
int n = 15;
count_one_bits(n);
return 0;
}
- 输出一个整数的每一位。
程序:
#include<stdio.h>
void f(unsigned int n)
{
for (int i = 31; i >= 0; i--)
{
int m = n >> i;
printf("%d ", m & 1);
}
}
int main()
{
int n = 15;
f(n);
return 0;
}
- 编程实现:
两个int(32位)整数m和n的二进制表达中,
有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
程序:
#include<stdio.h>
int f(int a, int b)
{
int c = a ^ b;
int count = 0;
for (int i = 0; i < 32; i++)
{
if (c & 1 == 1)
{
count++;
}
c = c >> 1;
}
return count;
}
int main()
{
int a = 1999;
int b = 2299;
printf("%d", f(a, b));
return 0;
}