欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > c语言操作符详解

c语言操作符详解

2025/5/24 19:41:00 来源:https://blog.csdn.net/weixin_65752158/article/details/139801545  浏览:    关键词:c语言操作符详解

 操作符详解

20df79a3aa584d458f41f61cd4fd01f3.png

59ccb1cafc44467090cbee4f0923881d.png

 1f9a8984a35849f7980572a5a7ee82d5.png

正数的原码反码补码相同

负数的原码最高位数是1,正数为0

 整数在内存中存储的是补码

ae916ba8b29b4805a5182aaa105c963b.png

负数的左移与右移,移的是补码,打印的是源码

补码-1取反就是原码。

左移有乘2的效果

22f45f0ad5d94130b0b112354ed389ce.png

左移和右移只针对整数。

vs里的右移操作赋采用的是算数右移,右边丢弃、左边补原符号位

符号位是根据正数还是负数来确定的,正数补0,负数补1.

657de460d8084c82a55f82dcaa8fb389.png

5d85f96f4a70465faa54f36d6000ab0e.png

总结:

计算的是以补码形式计算,打印的是以原码形式存在。

be7d6b6419ed43fb8ebdd09799e03fb8.png

cefaf8bc27a343c68243351d1bbb30fa.png

 计算的时候要用补码,因为整数在内存中存储的是补码。

按位与二个同时为1就得1,有一个不得1就为0.

9b0ce62655884c28bc695265ffb95a09.png

 取反的时候不要动符号位。

异或是相同为0,相异为1

e559e28e2129405abbf7b92c2ae88be1.png

1b312297a1de4e1fa6b9da33cd50f237.png

8d9d15b356c849f6bc389cc6cb264e46.png

0异或a是a  a异或a是0 

异或支持交换律

5167124baa004afa948ed23cedfb0153.png

统计二进制中有多少个1

96f47f4f881941e7b12b0f53a14caad9.png

任何一个数a按位与1如果==1就说明a的二进制最低是1

a&1==0 说明a的二进制最低位是0

c4a59502c50e4c1daba0bd08f226ad17.png

就比如这段二进制代码 a&1 第1位是0 就&1 得0 就跳过最低位,看第二位,如果第二位&1等于1就让COUNT++,一直循环下去。这样就可以知道这段二进制代码有多少个1了。

方法1 利用&和>>操作符计算出二进制代码有多少个1.

98906b083a2942ec8a1e26a350a1446c.png

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

46313fdf5f6d400692b37499f76a3e13.png

总结
把一个二进制向右移动i个位移到最低位和1进行按位与进行比,如果==1就说明二进制有1 

从右往左看,每次移到的位位数再增加,最高是32位

方法2:利用/2  %2的方法来

bf4d544d04d54c2bbc6551abe6f6f731.png

ee72854b22c845ad99a859e5a4f285ec.png

想得到二进制的每一位 /2  %2来解决这个问题

eeb6c6d905b2468eaa43cf6293695e0c.png

//考虑正负数问题
int count_one_bit(unsigned int n)
{int count = 0;while (n){if ((n % 2) == 1){count++;}n /= 2;}return count;
}
int main()
{int n = 0;scanf("%d", &n);int ret=count_one_bit(n);printf("%d\n", ret);return 0;
}

方法3

利用n=n&(n-1)来达到把n的二进制最右边的1去掉

比如n=-1

1111 n

1110 n-1

1110 n

1101 n-1

1100 n

1011 n-1

1000 n

0111 n-1

0000 n

利用这种效果来实现二进制代码有多少个1

55903e705f8043d5afa31cd007c5b020.png

//判断一个数是否是2的次方数

2ebdcb2770d9419d994cd8e0276ef4dd.png

//判断一个数的是否是2的次方数
//n=n&(n-1)
// 0001
//0010
//0100
//1000
int main()
{int n = 0;scanf("%d", &n);if ((n & (n - 1)) == 0){printf("YES\n");}else{printf("NO\n");}return 0;
}

练习2          二进制位 置0或者置 1 

编写代码将13⼆进制序列的第5位修改为1,然后再改回0?

4e47685dd455409c8a9fe9ce79ad90e1.png

443b91284ab4404e9bc65f924db53f9b.png

//编写代码将13⼆进制序列的第5位修改为1,然后再改回0 ?
// 0001 1101
int main()
{int n = 0;scanf("%d", &n);	// 13  0000 1101 //移到n = n | (1 << 4);  // 0000 1101 | 0001 0000==0001 1101printf("%d\n", n);//复原
//   0001 1101 变成 0000 1101
//   按位与1110 1111 即可   怎么变呢  1的二进制是  0000 0001 左移4位 0001 0000然后取反 1110 1111n = n & ~(1 << 4);printf("%d\n", n);return 0;
}

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

3412eade4862443d9465e5b2e53c2125.png

总结方法:

输入的数只要往右移,把每一个数移到最低位按位与上一个1就可以获得最低的是否是1了,可以明确判断出你输入的数转换成二进制形式有多少个1.

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同

6397adc8ead54802afced720dc7c2a06.png

0321b6d5f2c34d429764119352c0bcfc.png

10ccecb5a11b4499a63e440e2aa244e5.png

795c1ddb117d43e6a445672d2a2b40a2.png

语法说说支持连续赋值,建议写代码不要这么写。

354688d9e71745e5bbdfe067b7fa12fc.png

53b9e24fc0704b70881bec1a2aef4284.png

96ca1e12b07046a08772322659a89cb5.png

c81495572a44425f89589b854646bc97.png

效果一样。 

强制类型转换。 

f72b86df9f934a7ca69681a1a709cd98.png

7c77415756154d7db08374f96e4bffe0.png

afa731b646854ef0bc808101208aafdf.png

 1是40 2是4/8,3是10,4是4/8

b0257a30324948599e7c25449a0512a0.png

23cbcf305d7f47c294b43831de6b2264.png

逻辑与,左边为假右边就不计算了。

逻辑或,左边为真,右边就不计算了

 0428c84ddcc940ad896e42f1e5a87625.png

逗号表达式是从左到右计算,整个表达式的结果是最后一个表达式的结果。

237dc5030fa34438b0b3e2e51fa8cb22.png

99735537754a49b5bfb6a27c2c83e155.png

 50a22fc78f0d430bbb57a1289a77ddf9.png

b7767d114f4e469788162019df18ae4b.png

edba08ff4104420ab324d7fecd9ba2ac.png

5ac4a07cf140431387b1c46815667539.png

整型提升

b5f9e9c5d7854700a0cf2da7bd61e0a9.png

61256e0a4dc544889cc0b99ba0326d66.png

 d67e20c0c212487e8348debaf7e80abb.pngd3a790ba9ace421d840ad465a36e8a3a.png

20039b6e649a4e5aa4e4082e942ab1ee.png

一个char类型的占1个bit 相对于8个biye位,他要整型提升是因为    难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)
。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。

例如图中的a为5,b为126  先把a的原码写出来相加得出来后8位,首先看最高位是0或者1,是1补1,是0补0,得出来的是补码,因为整数在内存中的存储是补码形式的,然后-1取反得原码,因为打印的都是以原码形式打印的。

a与b会发生整形提升,a与b的值会发生变化。

f8be04e04df044dd9e0fd7a4f2a709a5.png

无符号的数发生整形提升,高位补0

55b1bba5aa7345cfb685333279cc59f4.png

上面的这些大小都小于int类型

下面讨论大小大于或者等于int类型的整形提升

31786e7b602545569db9c4d96149ed1a.png

这些类型都是向上转换的。

91ac16415dbf4a92aa7e140464a5898b.png

数据存储

72dadfe03e46428984b4b1771153d8f4.png

01b15cdb50ce411fa3a09a96ab239664.png

107135d8c33e4403a63af8d2d6e3fc72.png

有符号数直接用int或者 signed int类型的

无符号直接用unsigned int  类型的

05064003bebb4cef89bdb54f16a176f7.png

无符号不分最高位是正数还是负数,统一正数。

a44d106b60f84f7aab17d3d255998764.png

1e2e1ca68c0f4b50bc9e0c98fe6cea05.png

整形在内存中以补码形式存储

1fe5e35fe0a3453daf909930b2d19a7b.png

2f20eef4bf7a4b11a5a64c1d09d7492c.png

1+-1是通过补码形式实现+-的

原码取反+1得补码

补码取反+1得原码

6d4d46e90ffc4d12baeac6dad18de031.png

052ed810fa6a4c24a3da1328301249f1.png

把一个数的高位字节序内容放在低地址处,把一个低位字节序内容放在高地址处。这个叫大端存储

把一个数的高位字节序内容放在高地址处,把一个低位字节序内容放在地地址处 这个叫小端存储

7073939ef6f24af49ab6f83003497eca.png

放与拿相反。比如放进去的是44 33 22 11,拿出去的是11 22 33 44

vs里存的是小端存储模式

63fb56f41f9948669888d14190ecbe81.png

2d699b757e144248be6ce70139404768.png

667cdd5936f346ba9cb74071c9e65569.png

主要看起始地址,对起始地址解引用看是不是1还是0,并且还要强制类型转换成char*类型,int类型一次性访问4个字节。

3ad494e4b4614b30b02c76676d1c7b5c.png

c1b1c77c4d4847caa7f8529f41f02fad.png

0861437787ed4889988aed34bc681fd5.png

30011b4925794b4c822c36960c5a6edb.png

1558d53ff0f047939d03f910a96333fe.png

由于c是无符号数,整形提升的时候最高位是1,由于是无符号数,前面直接补0,所以是255,正数的原码补码,反码一样。

35cc3d7147e2418a89eef06305cee350.png

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词