Hello everbody!我们又见面啦!今天我准备给大家介绍一个有难度与深度的编程题。愿宝子们可以通过这个题目加深对c语言的理解和提高编程能力!
1.初识数据的存储
先简单介绍一下整数数据在计算机内存中是如何存储的,今后我会详细介绍一下这个知识点(整数,浮点数的存储).
不论是32位操作系统还是64位操作系统,int类型在内存中均占4个字节,每个字节含有8个bit位,每个bit位上的数字要么是0要么是1。也就是说一个int类型含有32个bit位.
那么int类型能够存储的最大整数是01111111 11111111 11111111 11111111 转换成十进制就是2^31-1,约为二十多亿。
其中最高位的0是符号位,0代表正数,1代表负数。
如果是unsigned int型,能够存储的最大整数是11111111 11111111 11111111 11111111转换成十进制就是2^32-1,约为四十多亿。
以上我说的这些都是数据的原码,正数是直接以原码的形式存储在内存中的。
当然,如果是负数的话在内存中的存储稍微有些复杂,需要把原码转换成反码再转换成补码。
本题我就先用较为简单的正数给大家讲解,等我讲过数据的存储后,会回过头来将负数部分给大家讲解清楚,届时欢迎大家前来赏光\(0^◇^0)/
2.思路引导与代码实现
我们先回顾一下有关数据存储的操作符:按位与&,按位或|,按位异或^,左移操作符<<,右移操作符>>
看到这些操作符,我们应该有一个想法:能不能拿到某个整数所有的奇数位和偶数位呢?换句话说就是将该整数的奇数位保持不变,偶数位全部变成0。偶数位不变,奇数位全部变成0。然后通过移位操作符,把所有的奇数位左移一位,所有的偶数位右移一位。然后把它们加起来不就ok了嘛!
那么如何得到奇数位和偶数位呢?
假设我要得到01111111 11111110 11111111 11111110的奇数位,那么我们可以让它和
01010101 01010101 01010101 01010101按位与&一下,这样就可以巧妙的把所有的偶数位变成0,而将这个数字转换成16进制就是0x55 55 55 55。
得到到偶数位也是同样得思路,只需将目标整数与0xaa aa aa aa. 在16进制中一个a代表10。
下面是这道题目得代码:
3.结语
好啦,今天得分享就到这里喽!不知道各位宝子有没有学到有用的知识呢?愿大家可以每天坚持敲代码,每天都努力提升自己呦!
本文如有表达不清晰或是逻辑错误的地方欢迎各位技术大佬不吝赐教!