- 方法一:
注意:
(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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!