黑马程序员技术交流社区
标题:
请大神给解说一下代码,谢谢了,特别是while循环这儿
[打印本页]
作者:
子城伯涵
时间:
2014-5-21 22:40
标题:
请大神给解说一下代码,谢谢了,特别是while循环这儿
本帖最后由 子城伯涵 于 2014-5-22 00:25 编辑
void putBinary(int n)
{
int bits = sizeof(n) * 8;
while (bits-->0) {
printf("%d", n>>bits&1);
if (bits%4==0) printf(" ");
}
作者:
戒惜舍得
时间:
2014-5-21 23:29
//定义一个 putBinary 函数 没有返回值, 形式参数是 int 类型
void putBinary(int n)
{
// 定义 一个 变量 bits , 把 整形变量 n 在内存中所占的字节 (在苹果 64位编译器下 是4个字节)乘上一个 8 最后赋给变量 bits 。 这句代码 就是求出 变量 n在内存中有几位。
int bits = sizeof(n) * 8;
// 当 bits-- (就是bits-1) 大于零时 这个就是循环结构 的 判断条件部分
while (bits-->0)
{
// 变量n x向右移动 (bits-1) 位 然后再与 1 位与运算就是 想通返回1 不同返回0 。如果一位是 1 值就是 1 那一位是 0 就返回 0
printf("%d", n>>bits&1);
// 如果 bits的值 除以4 余数为零, 那么 打印一个空格
if (bits%4==0) printf(" ");
}
// 此时 分析 是否 满足 (bits-1) 大于零的条件 如果满足 再执行一次 循环
}
复制代码
作者:
⒈心只霸占沵
时间:
2014-5-21 23:52
//首先给你讲一下这道题的思路
思路:int类型在内存中是32位,比如说1在内存中就是
0000 0000 0000 0000 0000 0000 0000 0001
>>位移,将二进制数系向右移,比如说我把6向右移动1
0000 0000 0000 0000 0000 0000 0000 0120 (6的二进制)
0000 0000 0000 0000 0000 0000 0000 0012 右移1后
0000 0000 0000 0000 0000 0000 0000 0012 &1后会得到最低位2
所以这道题的思路就是
先将一个数位移,然后将位移动后的数&1
1111 1111 1111 1111 1111 1111 1111 1111 这个数先右移31位得到
0000 0000 0000 0000 0000 0000 0000 0001 右边的1全部被移掉
再&1就得到了最低位的1 ,紧接着再移30位后&1,29位...以此类推
void putBinary(int n)
{
int bits = sizeof(n) * 8;//这里应该是int bits=sizeof(n)*8-1因为你最多移动32-1位,不然就移光了
while (bits-->0) {//这里的bits--就是循环减少右移的位数
printf("%d", n>>bits&1);//右移30 29 28....
if (bits%4==0) printf(" ");这里是为了好看,每四个位之间加个空格
}
复制代码
作者:
子城伯涵
时间:
2014-5-22 00:12
戒惜舍得 发表于 2014-5-21 23:29
很详细谢谢了
作者:
子城伯涵
时间:
2014-5-22 00:13
根据楼上俩大神的详解搞明白了,谢谢两位大神了,我要怎么设置成提问结束呢
作者:
子城伯涵
时间:
2014-5-22 00:16
⒈心只霸占沵 发表于 2014-5-21 23:52
//首先给你讲一下这道题的思路
思路:int类型在内存中是32位,比如说1在内存中就是
很详细谢谢了
作者:
子城伯涵
时间:
2014-5-22 00:22
⒈心只霸占沵 发表于 2014-5-21 23:52
//首先给你讲一下这道题的思路
思路:int类型在内存中是32位,比如说1在内存中就是
while开始判断的时候应该已经自减了一位了,前面不用减1了吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2