1.进制转换
1.1 10进制转2进制
方法:短除法
1.2 2进制转换8进制
//操作符详解
#include<stdio.h>
int main()
{
int num1 = 10;
//10存放在整型变量num1中,占4个字节==32个bit位
//0000 0000 0000 0000 0000 0000 0000 1010 -原码
//0000 0000 0000 0000 0000 0000 0000 1010 -反码
//0000 0000 0000 0000 0000 0000 0000 1010 -补码
//正数的原码,反码,补码都一样
int num2 = -10;
//-10存放在整型变量num2中,占4个字节==32个bit位
//1000 0000 0000 0000 0000 0000 0000 1010 -原码
//1111 1111 1111 1111 1111 1111 1111 0101 -反码
//1111 1111 1111 1111 1111 1111 1111 0110 -补码
//负数的原码,反码,补码要经过计算
return 0;
}
为什么计算机中存补码呢?
1-1
1+(-1)
0000 0000 0000 0000 0000 0000 0000 0001 -1的补码
1111 1111 1111 1111 1111 1111 1111 1111 -(-1)的补码
相加
1 0000 0000 0000 0000 0000 0000 0000 0000
最高位被丢弃
结果是0
3 移位操作符(移动的是补码)
3.1左移操作符
移位规则:左边抛弃,右边补0
#include<stdio.h>
int main()
{
int num = 10;
int n = num << 1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
3.2 右移操作符
右移操作符比左移操作符稍微复杂一点。
?应用哪种规则取决于编译器,目前大部分编译器上使用的算术右移,
#include <stdio.h>
int main()
{
int num = -10;
int n = num >> 1;
printf("n= %d\n", n);//-5
printf("num= %d\n", num);//-10
return 0;
}
int num = 10;
num>>-1;//error
4. 位操作符:& | ^ ~
注意:他们操作的对象必须是整数
区别: && (逻辑与)||(逻辑或),他们是逻辑操作符
#include <stdio.h>
int main()
{
int num1 = 3;
//0000 0000 0000 0000 0000 0000 0000 0011 3的补码
int num2 = -5;
//1111 1111 1111 1111 1111 1111 1111 1011 -5的补码
//
//按照(二进制)位进行运算
printf("%d\n", num1 & num2);//3
//& 有0就是0,全1为1
//0000 0000 0000 0000 0000 0000 0000 0011
printf("%d\n", num1 | num2);//-5
//| 有1为1,全0为0
//1111 1111 1111 1111 1111 1111 1111 1011
printf("%d\n", num1 ^ num2);//-8
//^ 相同为0,相异为1
//1111 1111 1111 1111 1111 1111 1111 1100
printf("%d\n", ~0);//-1
//~ 按位取反
// 1111 1111 1111 1111 1111 1111 1111 1111 -(-1)的补码
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
//0000 0000 0000 0000 0000 0000 0000 1010
int b = 20;
//0000 0000 0000 0000 0000 0000 0001 0100
a = a ^ b;
//a=
//0000 0000 0000 0000 0000 0000 0001 1110
//30
b = a ^ b;
//b=
//0000 0000 0000 0000 0000 0000 0000 1010
//10
a = a ^ b;
//a=
//0000 0000 0000 0000 0000 0000 0001 0100
//20
printf("a = %d b = %d\n", a, b);
return 0;
}
练习1 :编写代码实现 :求一个整数存储在二进制中1的个数
int main()
{
//方法1:&的应用
int num =5;
int i = 0; int count = 0;
for (i = 0; i < 32; i++)
{
if (((num >> i) & 1) == 1)//不用考虑正负数,移位操作符移动的是补码
count++;
}
printf("%d", count);
return 0;
}
问题: 什么时候要考虑正负数嘞?
#include <stdio.h>
int count_one_bit(unsigned int n)
//int count_one_bie(int n) 针对负数就可能出错
{
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n = n / 2;
}
return count;
}
方法3:
//最高效的一种
int count_one_bit(unsigned int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
5. 单目操作符
6.逗号表达式
int arr[10];//创建数组
arr[9] = 10;//实?下标引?操作符。
//[ ]的两个操作数是arr和9。
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //这?的()就是作为函数调?操作符。
test2("hello bit.");//这?的()就是函数调?操作符。
return 0;
}
8.结构体访问操作符
📌 结构是?些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚至是其他结构体
struct Stu
{
char name[20];
int age;
float score;
}stu;//全局变量
结构体的使用
//结构体的声明
struct Stu
{
char name[20];
int age;
float score;
}stu = {"Bob",18,97.5f};//全局变量的初始化
int main()
{
//结构体变量的初始化
struct Stu s1 = { "Mary",15,96.5 };//局部变量
//结构体的直接访问
printf("%s %d %lf\n", s1.name, s1.age, s1.score);
printf("%s %d %lf\n", stu.name, stu.age, stu.score);
//结构体的间接访问
struct Stu* ps = &s1;
printf("%s %d %lf\n", ps->name,ps->age,ps->score);
return 0;
}
9. 操作符的优先级和结合性
9.1 优先级
C语言中,可以通过数字的前缀来区分二进制和八进制。如果一个数字以0开头,则表示它是八进制数;如果一个数字以0b或0B开头,则表示它是二进制数。
例如,对于数字0111,根据前缀0,它被视为八进制数。要将其转换为十进制数,可以使用C语言中的atoi()函数或strtol()函数。
下面是一个示例代码:
#include <stdio.h> #include <stdlib.h> int main() { char *binary = "0111"; int decimal = strtol(binary, NULL, 8); printf("Decimal value: %d\n", decimal); // 输出:73 return 0; }
在上面的代码中,我们将字符串"0111"转换为八进制数73,并将其打印为十进制数