[英]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.