2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
方法一:
注意:
(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;
}