计算机函数二进制是怎样转换的

第一段代码 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++ 中的位运算

■网友
第一段代码很简单啊大意是逐位取出转换成字符放到字符串中不过有些地方的写法有问题第二段没看


    推荐阅读