簡體   English   中英

C中十進制到二進制的轉換

[英]Decimal to Binary Conversion in C

實現 inspect_bits 函數,該函數檢查給定數字的二進制表示中是否包含 2 個或更多連續的數字。 如果是,函數應該返回 1。否則,它應該返回 0。

例如,inspect_bits(13) 應該返回 1,因為它在其二進制表示 (1101) 中包含 2 個連續的 1。

該程序適用於某些數字,在本例中為 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

這看起來復雜,作為一種算法實現和調試。 這更簡單:

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 > 2)因為只有大於 2 的值才有兩個以上的連續位。

要確定無符號整數n是否設置了兩個相鄰的位,測試就足夠了:

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

其中n >> 1是數字n向右移動一位,這與整數除以 2 相同。您可以通過對位進行編號來可視化此方法:

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

按位和 ( & ) 是一個二元運算符。 如果兩個操作數都設置了相應的位,則其結果將設置一個位。 在上面的表達式中,如果n同時設置了位 0 和位 1,則設置位 0; 如果n設置了第 1 位和第 2 位,則設置第 1 位,依此類推。 如果沒有設置n兩個相鄰位,它將沒有設置位(因此為零)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM