【问题标题】:Decimal to Binary Conversion in CC中的十进制到二进制转换
【发布时间】:2019-04-09 22:20:01
【问题描述】:

实现 inspect_bits 函数,检查给定数字在其二进制表示中是否包含 2 个或多个连续数字。如果是,函数应该返回 1。否则,它应该返回 0。

例如,inspect_bits(13) 应返回 1,因为它在其二进制表示 (1101) 中包含 2 个连续的。

该程序适用于某些数字,在本例中为 13 和其他一些数字,但是该程序不适用于“8”、“10”和其他一些数字。

#include <stdlib.h>
#include <stdio.h>

int inspect_bits(unsigned int number)
{
    int arr[32];
    int i=0,temp,c=0;;

    while(number > 0)
    {
        arr[i] = number%2;
        number = number/2;
        i++;
    }
    for (int j=i-1; j>=0; j--)
    {
        temp = arr[j];
            for (int k=j+1; k>0; k--)
            {
                if (temp==arr[k])
                c++;
            }
    }
    if (c != 0)
        return 1;
    else
        return 0;
}

#ifndef RunTests
int main ()
{
    printf("%d", inspect_bits(13));
}
#endif

【问题讨论】:

  • returning 810 是什么?
  • 提示:c在什么条件下设置为非零值,在什么条件下设置为零?
  • 我会使用 &amp; 和可能的 &lt;&lt;&gt;&gt; 运算符直接检查位。

标签: c function search binary decimal


【解决方案1】:

这看起来方式太复杂了,作为一个算法实现和调试。这更简单:

int inspect_bits(unsigned int number)
{
   while (number)
   {
      if ((number & 3) == 3)
          return 1;
      number >>= 1;
   }
   return 0;
}

循环测试number 的最后两位与 3,即二进制的00000011。如果匹配,那么在number 中有(至少!)两个连续的位。如果不是,number 中的位将向右移动并再次测试。当 number 达到 0 时,循环可以停止——技术上甚至是 while (number &gt; 2),因为只有大于 2 的值才具有两个以上的连续位。

【讨论】:

  • 也许您可以添加十进制的3 是二进制的11
  • 成功了!你能解释一下吗?
【解决方案2】:

判断无符号整数n是否设置了两个相邻的位,测试一下即可:

(n & (n >> 1)) != 0

n &gt;&gt; 1 是数字n 右移一位,这与整数除以 2 相同。您可以通过对位编号来可视化此方法:

n            7 6 5 4 3 2 1 0
n >> 1         7 6 5 4 3 2 1

按位和 (&amp;) 是二元运算符。如果两个操作数都设置了相应的位,则其结果将设置一个位。在上面的表达式中,如果n 设置了位 0 和位 1,它将设置位 0;如果n 同时设置了第 1 位和第 2 位,则它将设置第 1 位,依此类推。如果没有设置n 的两个相邻位,它将不会设置任何位(因此为零)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多