10.22学习记录

本文介绍了C语言中位操作的实践,包括计算整数二进制中1的个数,对比了不同优化版本的实现方式。同时,讲解了赋值操作符、算术操作符、布尔类型、前置与后置操作符的区别,以及取地址符号`&`、`sizeof()`函数、按位取反`~`的用法。此外,还讨论了字符串比较、结构体打印和隐式类型转换,特别是整型提升的概念。作者分享了学习过程中的思考和经验总结。
摘要由CSDN通过智能技术生成

目录

一.二进制位

1.练习

1.mine

2.else

3.最终优化版

二.赋值操作符

三. 算术操作符

四.布尔类型

五前置操作符和后置操作符的区别

六.取地址符号&

七.sizeof()

八.~      对一个数的二进制按位取反

九.字符串的比较

十.结构体的打印

十一.隐式类型转换

1.//负数的整形提升

//正数的整形提升

十一.学习心得


一.二进制位

1.练习

编写代码实现:求一个整数存储在内存中的二进制中1的个数

1.mine

思路:一个数的二进制位可以让它和1进行按位与.这样就能知道第一位二进制位有没

按位与:&两个都是1才是1.不然都是0

然后再让1往左移位一位.继续让它跟第二位比较.建立循环.

但是这里出现了BUG

操作符优先级的问题,所以最好习惯性加括号

int main()//编写代码实现:求一个整数存储在内存中的二进制中1的个数
{
int n = 5;
//00000000000000000000000000000101
//00000000000000000000000000000001>1  与这样的二进制位进行按位与就能知道
//第一位数有没有.没有就得0.依次可继续
//00000000000000000000000000000010>2
int count = 0;
//count = n & count;
int i = 1;
int m = 1;
while (m <= 32)
{
if ((n & i) != 0)
{
count++;
}
i = i << 1;
m++;
}
printf("%d\n", count);
return 0;

}

2.else

优化版:让n每一个二进制位都循环移到第一位分别与1进行按位与

原理与第一种类似,但是这种明显减少了计算量.

int main()//编写代码实现:求一个整数存储在内存中的二进制中1的个数
{
int n = 5;
int count = 0;
int i = 1;
int m = 0;
while (m < 32)
{
if (1==((n>>m)&1))
{
count++;
}
m++;
}
printf("%d\n", count);
return 0;

}

3.最终优化版

#include <stdio.h>
int main()
{
 int num = -1;
 int count = 0;//计数
 while(num)
 {
 count++;
 num = num&(num-1);
 }
 printf("二进制中1的个数 = %d\n",count);
 return 0;
}

用n作为循环条件,每次num-1就是对二进制位有顺序的-1.再对num本身进行按位与.这里得到的就是num-1;

再次减1这样比移位操作符好的点这里可以直接跳过很多数直接-1,大大减少了循环次数

        

二.赋值操作符

从右向左开始赋值

三. 算术操作符

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。

3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数

四.布尔类型

//C语言中C99之前没有表示真假的类型
//C99中引用了布尔类型
//
#include <stdbool.h>

int main()
{
_Bool flag1 = false;
bool flag2 = true;

if (flag2)
{
printf("hehe\n");
}

//C语言中0表示假,非0表示真

五前置操作符和后置操作符的区别

前置操作符就相当于 b=a,然后a=a+1;

后置操作符相当于a=a+1,再b=a;

1.相当于先比较再赋值.因为a赋值前为0,所以前两个表达式都为0.那么最后一个表达式更为0就不用比较了.

所以只有a赋值了.其他的都没计算

2.因为是或操作符.无所谓a为0/b操作结果为真/所以前两个表达式为真.那么无所谓d的操作.所以d没计算

3.因为a++先操作.为0所以第二个表达式既不计算都无所谓,因为都为0,所以前两个表达式都为0.所以第三个表达式要计算

六.取地址符号&

&arr;//取出数组的地址,数组的地址应该放到【数组指针】中去

数组名就是首元素地址

//int main()
//{
//int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//printf("%d\n", arr[4]);//arr[4]--> *(arr+4)
//printf("%d\n", 4[arr]);

arr[4]相当于arr向右移动4个位置

七.sizeof()

.sizeof      操作数的类型长度(以字节为单位)

计算类型创建的变量所占内存的大小,单位是字节

sizeof()中的表达式不参与计算

//int a = 10;
//short s = 0;
//printf("%d\n", sizeof(s = a + 2));//

返回值就是2

%u 无符号10进制整数

八.~      对一个数的二进制按位取反

-1的补码是111111111111111111111111111,按位取反就是0000000000000也就是0

就可以终止循环

九.字符串的比较

两个字符串之间不能直接比较

而要通过strcmp函数需要引用头文件string.h

它是用来比较字符串对应位置的大小,而不是比较长度的

c的ASCII码值大于b

十.结构体的打印

二三种情况,要有指针接收才可以

意.这要跟整型数组区分开.整型数组可以这样.因为整型数组赋值了一个数字,而整型数组的名字就是首元素的地址

恰好满足它的内存,但是张三丰的字节远远超过char类型的大小

除非只放一个字母

十一.隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

先发生截断.然后二进制位相加.

进行正负操作就会发生整型提升,表达式结果就为整型

1.//负数的整形提升

char c1 = -1;

变量c1的二进制位(补码)中只有8个比特位:

1111111

因为 char 为有符号的 char

所以整形提升的时候,高位补充符号位,即为1

提升之后的结果是:

11111111111111111111111111111111

//正数的整形提升

char c2 = 1;

变量c2的二进制位(补码)中只有8个比特位:

00000001

因为 char 为有符号的 char

所以整形提升的时候,高位补充符号位,即为0

提升之后的结果是:

00000000000000000000000000000001

//无符号整形提升,高位补0

十一.学习心得

这几天因为比较懒.没怎么写心得了.其实感觉这东西还是得写写..感觉学到后面,忘了前面.有的时候也会不爱动脑,太懒了.感觉自己脑子不够用转的不够快..可能长时间学习,导致用脑疲劳了,今天上午还要去做实验,不过连续七八个小时对着电脑学.也难怪自己后面的效率低.但是又想学的快一点.怕赶不上进度.心累啊.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值