【笔记】获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列

来源:互联网 发布:淄博市网络教研平台 编辑:程序博客网 时间:2024/04/29 21:28

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;  }  





1 0