计算机函数二进制是怎样转换的
第一段代码 static int size = 8 * sizeof(int);
1 byte 有 8 位。sizeof(int)算出有多少个byte,这时候,size 就得到总共有多少二进制位。 for (i = size - 1; i \u0026gt;= 0; i--, n \u0026gt;\u0026gt;= 1) ps = (01 \u0026amp; n) + \u0026#39;0\u0026#39;;
for 循环中,有两个变量。i,表示字符二进制位的索引,i 逆序遍历。n \u0026gt;\u0026gt;= 1,右移。比如 n 二进制表示为,00001001,(这里以8位表示,其它一样的)。 连续右移,为 00001001 -\u0026gt; 00000100 -\u0026gt; 00000010 -\u0026gt; 00000001 .....
这个时候,01 \u0026amp; n, 就为。 00001001 -\u0026gt; 00000100 -\u0026gt; 00000010 -\u0026gt; 00000001 ..... 与 00000001 -\u0026gt; 00000001 -\u0026gt; 00000001 -\u0026gt; 00000001 等于 00000001 -\u0026gt; 00000000 -\u0026gt; 00000000 -\u0026gt; 00000001 .... 加 \u0026#39;0\u0026#39;,就是 \u0026#39;1\u0026#39; -\u0026gt; \u0026#39;0\u0026#39; -\u0026gt; \u0026#39;0\u0026#39; -\u0026gt; \u0026#39;1\u0026#39;
这样,就可以逆序得到二进制数字的字符值。
因为 i, 也是逆序,赋值给 ps的。所以最后的结果,就是字符数组中,正确存放了,二进制的字符值。
第二段代码 int invert_end(int num, int bits)
这函数,并非翻转num, 而是翻转num的后几位。bits表示需要翻转后面的位数。 int mask = 0; int bitval = 1; while (bits-- \u0026gt; 0) { mask |= bitval; bitval \u0026lt;\u0026lt;= 1; }
这里的循环,是要构造后面全是1的掩码mask。还是用8位表示,假如,bits为4,就是要构造出 00001111。bits为5,就是要构造出00011111。看那个循环
bits--\u0026gt;0, 其实是 bits-- \u0026gt; 0, 表示要循环 bits 次。以3次为例。bitval左移,就是 bitval: 0000 0001 -\u0026gt; 0000 0010 -\u0026gt; 0000 0100
这样mask 开始为 0000 0000, 0次 mask = 0000 0000 1次 mask | bitval = 0000 0000 | 0000 0001 = 0000 0001, 2次 mask | bitval = 0000 0001 | 0000 0010 = 0000 0011 3次 mask | bitval = 0000 0011 | 0000 0010 = 0000 0111
循环3次后,掩码mask就构造好了,等于0000 0111。之后调用 return num ^ mask;
0^0=0
0^1=1
0 异或 数字,数字不变
1^0=1
1^1=0
1 异或 数字,数字取反。
所以构造好mask之后,假如mask为,00000111,就表示前面二进制数字不变,后面数字取反。
附: 【计算机函数二进制是怎样转换的】 更多位运算的内容,可以看看我以前的博客文章。 C/C++ 中的位运算
■网友
第一段代码很简单啊大意是逐位取出转换成字符放到字符串中不过有些地方的写法有问题第二段没看
推荐阅读
- 大部分黑客或安全研究员读的是啥「大学专业 」
- 在哈尔滨工业大学计算机系就读是啥样的体验
- 计算机技术与科学专业怎样利用高中毕业的暑假
- 非计算机专业想要利用课余时间深入自学C++,想要找到比较体面的工作大概需要啥水平
- 有点计算机基础的人想尽快找份编程的工作。哪种编程的工作最好找还需要学些啥
- 硕士研究生选通信还是计算机视觉
- 华威大学计算机本科咋样
- 加拿大像滑铁卢,多伦多大学的计算机授课型研究生咋样
- 计算机进不了桌面,任务管理器也打不开,咋办
- 想寒假的时候一个月在家准备计算机二级的office高级应用,但是不知道买啥书比较好~~~?