当前位置: 首页 > news >正文

(心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。

题目:获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。

解题知识点:

  • 操作运算符 &按位与,>>右移操作符

  • 循环语句

  • 数组运用和输出数组

  • 解法一
    利用数组先存后用 简单易懂
    思路:可知在一个整数在内存中占4个字节,也就是32个比特位。所以用两个数组一个表示奇数列,一个表示偶数列。然后通过移位计算出奇数列,偶数列并且存入数组。然后通过数组输出就解决了。(应该从最高位输出,倒序输出数组就可以了

void print_binary_bit_1(int val)
{
	int arr1[16] = { 0 };//偶数列数组
	int arr2[16] = { 0 };//奇数列数组
	int i = 0;
	for (i = 0; i < 16; i++)//在一个循环内面,同时计算奇数列,偶数列。所以循环16次
	{
		if ((val & 1) == 1)//计算奇数列
		{
			arr1[i] = 1;
		}
		val >>= 1;
		if ((val & 1) == 1)//计算偶数列
		{
			arr2[i] = 1;
		}
		val >>= 1;
	}
   //对数组进行输出
	printf("偶数列:> ");
	for (i = 15; i >= 0; i--)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");

	printf("奇数列:> ");
	for (i = 15; i >= 0; i--)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
}
  • 解法二
    利用在输出的时候计算,缩短代码量
    思路:数组存储显然有些麻烦,要先存后输出,我们可以直接进行输出并且输出与计算并行。只需要通过控制两个循环就可以达到目的,一个控制每次遍历奇数列(i=31,29,27…),一个控制每次遍历偶数列(i=30,28,26…)向右移动i位来计算。

void print_binary_bit_2(int val)
{
	int i = 0;
	printf("偶数列:> ");
	for (i = 30; i >= 0; i -= 2)//向右移动30,则次高位也就是第一个偶数位就在最低位了
	{
		printf("%d", (val >> i) & 1);//与1做与运算
	}
	printf("\n");
	
	printf("奇数列:> ");
	for (i = 31 ; i >= 0; i -= 2)//向右移动31,则最高位也就是第一个奇数位就在最低位了
	{
		printf("%d", (val >> i) & 1);//与1做与运算
	}
	printf("\n");
}

总代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

void print_binary_bit_1(int val)
{
	int arr1[16] = { 0 };//偶数列数组
	int arr2[16] = { 0 };//奇数列数组
	int i = 0;
	for (i = 0; i < 16; i++)//在一个循环内面,同时计算奇数列,偶数列。所以循环16次
	{
		if ((val & 1) == 1)//计算奇数列
		{
			arr1[i] = 1;
		}
		val >>= 1;
		if ((val & 1) == 1)//计算偶数列
		{
			arr2[i] = 1;
		}
		val >>= 1;
	}
   //对数组进行输出
	printf("偶数列:> ");
	for (i = 15; i >= 0; i--)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");

	printf("奇数列:> ");
	for (i = 15; i >= 0; i--)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
}

void print_binary_bit_2(int val)
{
	int i = 0;
	printf("偶数列:> ");
	for (i = 30; i >= 0; i -= 2)//向右移动30,则次高位也就是第一个偶数位就在最低位了
	{
		printf("%d", (val >> i) & 1);//与1做与运算
	}
	printf("\n");
	
	printf("奇数列:> ");
	for (i = 31 ; i >= 0; i -= 2)//向右移动31,则最高位也就是第一个奇数位就在最低位了
	{
		printf("%d", (val >> i) & 1);//与1做与运算
	}
	printf("\n");
}

int main()
{
	int val = 0;
	scanf("%d", &val);
	print_binary_bit_1(val);
	//print_binary_bit_2(val);
	system("pause");
	return 0;
}
运行截图:

运行结果

相关文章:

  • 大小端(存储)模式辨析———数据的存储
  • memcpy()、memmove()函数的模拟实现———C语言
  • 结构体解析——— 自定义类型
  • 联合体和枚举——— 自定义类型
  • 结构体通讯录——C语言知识运用
  • 编译和宏的理解
  • 时间空间复杂度——详解
  • 【数据结构:队列】——队列的实现(C语言)
  • 【数据结构:栈】——栈的实现(C语言)
  • 【数据结构:链表】——无头单向非循环链表的实现(C语言)
  • 【数据结构:链表】——带头双向循环链表的实现(C语言)
  • 【数据结构:堆】——堆及堆的相关操作(C语言)
  • c++入门——基础知识点(1)
  • c/c++内存管理
  • 函数模板、类模板初识
  • [deviceone开发]-do_Webview的基本示例
  • [译] React v16.8: 含有Hooks的版本
  • JDK 6和JDK 7中的substring()方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PHP 的 SAPI 是个什么东西
  • Promise面试题,控制异步流程
  • Python进阶细节
  • React as a UI Runtime(五、列表)
  • Shadow DOM 内部构造及如何构建独立组件
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SQLServer之创建数据库快照
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 工作手记之html2canvas使用概述
  • 前端攻城师
  • 三栏布局总结
  • 使用parted解决大于2T的磁盘分区
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一道闭包题引发的思考
  • 正则表达式
  • ​linux启动进程的方式
  • #define
  • #图像处理
  • ${ }的特别功能
  • (6)STL算法之转换
  • (Java)【深基9.例1】选举学生会
  • (poj1.3.2)1791(构造法模拟)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (分类)KNN算法- 参数调优
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 验证控件和javaScript的冲突问题
  • .NET 中 GetProcess 相关方法的性能
  • .net反混淆脱壳工具de4dot的使用
  • .NET性能优化(文摘)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d