1:count_bits(~0u) 这个返回值 ,应该是程序自动计算出不同计算机的位宽吧?以后求此类问题,都可套用此函数吧?如果是64位,是表示CPU 是64位,还是操作系统是64位?
我理解的是 (是程序自动计算出不同计算机的位宽) 以后可以利用这种方法。
如果结果是64 表示当前编译,对unsigned int 型 编译成了 64=8(字节)*8(bit) 只能说明如此 ,至于CPU 是64位,还是操作系统 关系不是太大
2:for (i=int_bits()-1;i>=0;i--) 这里i=int_bit()-1;这个表达式不明白,i 表示位移的位数,是不是由于unsigned x,最高位符号位是0,不能移动? 如0111向右移4位,在表达式
((x>>i)&1u) ? '1':'0' 中,和移三位没有区别啊。 若表达式改为 ((x>>i)&1u) ? '0':'1',则符号发生了变化。有点凌乱。
首先 unsigned int 最高位有可能是1 未必都是0的。
简单说说呀:我们假设前面所说的是8位的unsigned int 的编译环境
x=1011 0101 (由于假设是8位环境)
我们想顺序输出 1 0 1 1 0 1 0 1 怎么处理呢
第一我们输出x最高位 1:
先把x 右移操作 1次 01011010
再把x 右移操作 1次 00101101
再把x 右移操作 1次 00101101
。。。。。。。 一共移多少次呢 8-1次 (这里可以解释i=int_bits()-1)
结果是x= 00000001 (末尾的1 表示x之前最高位是1)
第二我们输出x次高位 0:
先把x 右移操作 1次 01011010
再把x 右移操作 1次 00101101
再把x 右移操作 1次 00101101
。。。。。。。 一共移多少次呢 8-1-1次 (这里可以解释i--)
结果是x= 00000010 (末尾的0 表示x之前次高位是0)
其他的不多说了
关于这个 ((x>>i)&1u) ? '1':'0'
x向右移动i位 & 1u 就是说 按位进行与运算
假设 x=1010 1001 & y=0000 0001 结果只保留x的最低位。
结果是个临时变量 temp=0000 0001 (保留x最低位的特质)
temp ? '1':'0' 这个是个冒号表达式,前面的temp != 0 这个表达式结果就是1 前面temp == 0 这个表达式就是0
若表达式改为 ((x>>i)&1u) ? '0':'1',则符号发生了变化。有点凌乱。
那样做的话 结果就是0 1 互换 ,原来是1 生成了0 原来是0 则变成了1
3:void print_bits (unsigned x) //由主函数 输入x=“00000000000000000010100101010101010010101” 共32位
//注意这里01是计算机自动转换的 其实输入的是x=565412521
是否只有涉及到位运算符&,如 123&456,计算机都会自动把十进制123,456转化成相应的二进制 ?
计算机内部是按照x=“00000000000000000010100101010101010010101” 储存的
涉及到位运算符&,我们人工解释代码的时候 需要手动将10 16进制翻译成二进制。