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

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





  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值