獲取一個數二進制序列中所有的偶數位和奇數位,分別輸出二進制序列。

  • 方法一:

注意:

(1)在第二個for循環的時候,記得置j=0,因爲在上面已經將它加到15達到最大,若不管則發生越界
(2)這種方法也屬於按位與,只是如果不用數組,那麼輸出的是二進制的逆序
(3)但是這種方法創建了數組,佔用空間,理論上不夠優化

#include <stdio.h>
int main()
{
    int i=0,j=0;
    char arr1[16];  //定義2個數組來存放二進制序列
    char arr2[16];
    int num=0;
    scanf("%d",&num);
    for(i = 0; i < 32; i += 2)
    {
        arr1[j] = ((num >> i) & 1);  //奇數位
        j++;
    }  
    for(i = 1,j=0; i < 32; i += 2)
        {
            arr2[j] = ((num >> i) & 1);  //偶數位
            j++;
        }
    printf("奇數位爲:");  //輸出數組裏的二進制奇數序列
    for (i = 15; i >= 0; i--)
        {
            printf("%d",arr1[i]);
        }
    printf("\n");
    printf("偶數位爲:");  //輸出數組裏的二進制偶數序列
    for (i = 15; i >= 0; i--)
        {
            printf("%d",arr2[i]);
        }
    return 0;
}
  • 方法二:(比較優化)

注意:

(1)這裏的每次移動31,29...位數都是相對於原來的2進制序列來說,其實每次相對於上一次就移動了2位

(2)這種方法也是按位與的方法得到某位二進制的,比如說看奇數位,那每次向右移動31位,再與1得到第一位情況,
下一次移動29位與1得到第三位,以此類推,所以奇數列可得,類似的偶數列只是開始移動30位

#include <stdio.h>  
int main ()  
{  
    int num=0,i=0;  
    scanf("%d",&num);  
    printf("奇數序列爲:");  
    for(i=31;i>=0;i-=2)  //也是控制32次(每個整型數按32位來算),只是從31位開始移動  
    {  
        printf("%d ",(num>>i)&1);  //第一次向右移動31位和1與得到第一位情況,每次變化2位,即可得到奇數位情況  
    }  
    printf("\n");  
    printf("偶數序列爲:");  
    for(i=30;i>=0;i-=2)  //向右移動30位,再與1所得結果是原來數字的第二位,再移28位...  
    {  
        printf("%d ",(num>>i)&1);  //  
    }  
    printf("\n");  
    return 0;  
}

作者:lyl194458
來源:CSDN
原文:https://blog.csdn.net/lyl194458/article/details/53098345
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章