黑马程序员技术交流社区

标题: 请大神给解说一下代码,谢谢了,特别是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
  1. //定义一个 putBinary 函数   没有返回值,  形式参数是 int 类型

  2. void putBinary(int n)
  3. {
  4. //  定义 一个 变量 bits  , 把  整形变量 n 在内存中所占的字节 (在苹果 64位编译器下 是4个字节)乘上一个 8   最后赋给变量 bits  。 这句代码 就是求出 变量 n在内存中有几位。
  5.     int bits = sizeof(n) * 8;
  6.     //  当   bits--   (就是bits-1)  大于零时  这个就是循环结构 的 判断条件部分
  7.     while (bits-->0)
  8.     {
  9.        // 变量n  x向右移动   (bits-1) 位   然后再与 1     位与运算就是 想通返回1 不同返回0 。如果一位是 1  值就是 1  那一位是 0  就返回 0
  10.         printf("%d", n>>bits&1);
  11.        // 如果 bits的值 除以4  余数为零, 那么 打印一个空格
  12.         if (bits%4==0) printf(" ");
  13.     }
  14.     // 此时 分析 是否 满足   (bits-1) 大于零的条件   如果满足 再执行一次 循环
  15. }
复制代码

作者: ⒈心只霸占沵    时间: 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位...以此类推
           
  1. void putBinary(int n)
  2. {
  3.     int bits = sizeof(n) * 8;//这里应该是int bits=sizeof(n)*8-1因为你最多移动32-1位,不然就移光了
  4.       while (bits-->0) {//这里的bits--就是循环减少右移的位数
  5.         printf("%d", n>>bits&1);//右移30 29  28....
  6.         if (bits%4==0) printf(" ");这里是为了好看,每四个位之间加个空格
  7. }      
复制代码


作者: 子城伯涵    时间: 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