【C语言】位运算实现二进制数据处理及BCD码转换

文章目录

  • 1.编程实验:按`short`和`unsigned short`类型分别对`-12345`进行`左移2`位和`右移2`位操作,并输出结果。
  • 2.编程实验:利用位运算实现`BCD码`与`十进制数`之间的转换,假设数据类型为`unsigned char`。
  • 3.编程实验:利用位运算实现二进制数据的处理,包括按二进制输出、将指定位取反、置0和置1等操作。

位运算是计算机科学中一项重要的技术,它可以对二进制数据进行快速高效的处理。通过位运算,我们可以进行移位操作、按位与、按位或、按位取反等操作,从而实现各种数据操作和转换。

1.编程实验:按shortunsigned short类型分别对-12345进行左移2位和右移2位操作,并输出结果。

int main()
{short s = -12345;unsigned short us = -12345;printf("有符号整数左移2位:\n");printf("十进制结果:%d\n", s << 2);printf("十六进制结果:%X\n", s << 2);printf("无符号整数左移2位:\n");printf("十进制结果:%u\n", us << 2);printf("十六进制结果:%X\n", us << 2);printf("有符号整数右移2位:\n");printf("十进制结果:%d\n", s >> 2);printf("十六进制结果:%X\n", s >> 2);printf("无符号整数右移2位:\n");printf("十进制结果:%u\n", us >> 2);printf("十六进制结果:%X\n", us >> 2);return 0;
}

在这里插入图片描述

(1)无符号整数与有符号整数的移位运算的区别在于有符号整数的右移操作会进行算术移位,即保持符号位不变,从而保持数值的符号;而无符号整数的移位操作是逻辑移位,不会改变符号位。
(2)左移2位操作相当于将数值乘以4(2的2次方),右移2位操作相当于将数值除以4(2的2次方)。但需要注意,这只是一个一般的规律,在实际情况中可能会受到舍入或溢出的影响。

2.编程实验:利用位运算实现BCD码十进制数之间的转换,假设数据类型为unsigned char

#include <stdio.h>// 将BCD码转换为十进制数
unsigned char bcd_to_decimal(unsigned char bcd) {unsigned char tens = (bcd >> 4) & 0x0F;  // 十位数unsigned char ones = bcd & 0x0F;         // 个位数return tens * 10 + ones;
}// 将十进制数转换为BCD码
unsigned char decimal_to_bcd(unsigned char decimal) {unsigned char tens = decimal / 10;       // 十位数unsigned char ones = decimal % 10;       // 个位数return (tens << 4) | ones;
}int main() {unsigned char bcd = 0x36;  // BCD码 36 对应十进制数 36unsigned char decimal = bcd_to_decimal(bcd);printf("BCD码 0x%02X 对应的十进制数为: %d\n", bcd, decimal);unsigned char converted_bcd = decimal_to_bcd(decimal);printf("十进制数 %d 对应的BCD码为: 0x%02X\n", decimal, converted_bcd);return 0;
}

在这里插入图片描述
BCD码(Binary-Coded Decimal)是一种将十进制数转换为二进制编码的方式。在BCD码中,每个数字都用四个比特表示,其中高四位表示十位数,低四位表示个位数。例如,数字 36BCD码为 0011 0110
在将BCD码转换为十进制数时,只需将高四位和低四位分别转换为十进制数,再将其相加即可得到对应的十进制数。例如,BCD0011 0110 对应的十进制数为 3×10+6=36
在将十进制数转换为BCD码时,可以将十进制数的十位数和个位数分别转换为四位的二进制数,然后将其合并为一个八位的二进制数即可。例如,数字 36 可以转换为两个四位的二进制数 00110110,最终得到的BCD码为 0011 0110
因此,使用位运算实现BCD码与十进制数之间的转换,可以通过按位与、按位或、移位等位运算符来处理各个数字的高低四位,从而实现转换功能。

3.编程实验:利用位运算实现二进制数据的处理,包括按二进制输出、将指定位取反、置0和置1等操作。

#include <stdio.h>// 按二进制输出
void print_binary(unsigned char data) {for (int i = 7; i >= 0; i--) {unsigned char bit = (data >> i) & 1;printf("%u", bit);}printf("\n");
}// 将指定位取反
unsigned char toggle_bit(unsigned char data, int position) {unsigned char mask = 1 << position;return data ^ mask;
}// 将指定位置0
unsigned char clear_bit(unsigned char data, int position) {unsigned char mask = ~(1 << position);return data & mask;
}// 将指定位置1
unsigned char set_bit(unsigned char data, int position) {unsigned char mask = 1 << position;return data | mask;
}int main() {unsigned char data = 0b10101100;printf("原始数据: ");print_binary(data);printf("将第3位取反: ");unsigned char toggled_data = toggle_bit(data, 2);print_binary(toggled_data);printf("将第5位置0: ");unsigned char cleared_data = clear_bit(data, 4);print_binary(cleared_data);printf("将第6位置1: ");unsigned char set_data = set_bit(data, 5);print_binary(set_data);return 0;
}

在这里插入图片描述

  1. print_binary: 该函数按照二进制形式输出给定数据的每一位。它通过循环从最高位到最低位,逐个取出每一位的值,并使用 printf 函数输出。
  2. toggle_bit: 该函数将给定数据中指定位置的位取反。它首先创建了一个只有指定位为 1,其余位为 0 的掩码 mask,然后通过将 datamask 进行异或操作 (^),可以将指定位置的位取反。
  3. clear_bit: 该函数将给定数据中指定位置的位置为 0。它首先创建了一个只有指定位为 0,其余位为 1 的掩码 mask,然后通过将 data 和 mask 进行按位与操作 (&),可以将指定位置的位清零。
  4. set_bit: 该函数将给定数据中指定位置的位置为 1。它首先创建了一个只有指定位为 1,其余位为 0 的掩码 mask,然后通过将 datamask 进行按位或操作 (|),可以将指定位置的位置为 1
    main 函数中,我们定义了一个初始数据 0b10101100,然后调用上述函数,演示了将第3位取反、将第5位置0和将第6位置1的操作。最后,通过调用 print_binary 函数,输出了每个操作后的结果。

通过以上实验,我们展示了位运算在二进制数据处理和BCD码转换中的应用,包括移位操作、按位与、按位或、按位取反等操作。这些位运算操作可以快速高效地处理二进制数据,有助于提高程序的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程(进阶二:CAS)

目录 一、CAS的简单介绍 CAS逻辑&#xff08;用伪代码来描述&#xff09; 二、CAS在多线程中简单的使用 三、原子类自增的代码分析 都看到这了&#xff0c;点个赞再走吧&#xff0c;谢谢谢谢谢 一、CAS的简单介绍 CAS的全称&#xff1a;“Compare And Swap”&#xff0c;字…

C语言——字符函数和字符串函数(一)

&#x1f4dd;前言&#xff1a; 这篇文章对我最近学习的有关字符串的函数做一个总结和整理&#xff0c;主要讲解字符函数和字符串函数&#xff08;strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat&#xff09;的使用方法&#xff0c;使用场景和一些注意事项&…

Java入门项目--蚂蚁爱购

简介 这是一个靠谱的Java入门项目实战&#xff0c;名字叫蚂蚁爱购。 从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目&#xff0c;教程路线是&#xff1a;搭建环境> 安装软件> 创建项目> 添加依赖和配置> 通过表生成代码> 编写Ja…

解锁MySQL的威力:针对常见问题的快速解决指南

数据库和表的创建 创建数据库&#xff1a; CREATE DATABASE IF NOT EXISTS MyDatabase; USE MyDatabase;案例&#xff1a; 想象您要开始一个博客项目。首先&#xff0c;您需要一个地方来存储所有的文章和用户信息。上述命令帮助您创建了这样一个存储空间&#xff0c;名为MyDa…

RocketMQ-源码架构二

梳理一些比较完整&#xff0c;比较复杂的业务线 消息持久化设计 RocketMQ的持久化文件结构 消息持久化也就是将内存中的消息写入到本地磁盘的过程。而磁盘IO操作通常是一个很耗性能&#xff0c;很慢的操作&#xff0c;所以&#xff0c;对消息持久化机制的设计&#xff0c;是…

蒙特霍尔问题(选择三扇门后的车与羊)及其贝叶斯定理数学解释

1. 蒙特霍尔问题 有一个美国电视游戏节目叫做“Let’s Make a Deal”&#xff0c;游戏中参赛者将面对3扇关闭的门&#xff0c;其中一扇门背后有一辆汽车&#xff0c;另外两扇门后是山羊&#xff0c;参赛者如果能猜中哪一扇门后是汽车&#xff0c;就可以得到它。 通常&#xf…

javaee实验:文件上传及拦截器的使用

目录 文件上传ModelAttribute注解实验目的实验内容实验过程项目结构编写代码结果展示 文件上传 Spring MVC 提供 MultipartFile 接口作为参数来处理文件上传。 MultipartFile 提供以下方法来获取上传的文件信息&#xff1a;  getOriginalFilename 获取上传的文件名字&#x…

飞天使-linux操作的一些技巧与知识点2

TCP 的三次握手 第一次&#xff0c;客户端与服务端建立链接&#xff0c;需要发送请求连接的消息 第二次&#xff0c;服务端接口到数据后&#xff0c;返回一个确认的操作*&#xff08;至此客户端和服务端链路建立成功&#xff09; 第三次&#xff0c;服务端还需要发送要与客户端…

【Linux】探索Linux进程状态 | 僵尸进程 | 孤儿进程

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 目录 一、进程状态1.1运行状态1.2阻塞状态1.3挂起状态 二、具体L…

React中使用react-json-view展示JSON数据

文章目录 一、前言1.1、在线demo1.2、Github仓库 二、实践2.1、安装react-json-view2.2、组件封装2.3、效果2.4、参数详解2.4.1、src(必须) &#xff1a;JSON Object2.4.2、name&#xff1a;string或false2.4.3、theme&#xff1a;string2.4.4、style&#xff1a;object2.4.5、…

[ROS2] --- service

1 service介绍 1.1 service概念 话题通信是基于订阅/发布机制的&#xff0c;无论有没有订阅者&#xff0c;发布者都会周期发布数据&#xff0c;这种模式适合持续数据的收发&#xff0c;比如传感器数据。机器人系统中还有另外一些配置性质的数据&#xff0c;并不需要周期处理&…

C#,图算法——以邻接节点表示的图最短路径的迪杰斯特拉(Dijkstra)算法C#程序

1 文本格式 using System; using System.Text; using System.Linq; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm { public class Node // : IComparable<Node> { private int vertex, weigh…

【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)

目录 前言阅读对象阅读导航前置知识笔记正文一、单体服务介绍二、服务拆分三、分布式微服务升级前的思考3.1 关于SpringBoot/SpringCloud的思考【有点门槛】 四、SpringCloud升级整合4.1 新建父子项目 学习总结感谢 前言 从本节课开始&#xff0c;我将自己手写一个基于SpringC…

如何轻松恢复 Windows 中删除的文件夹

我们都曾经历过这样的事&#xff0c;而且我们中的大多数人可能很快就会再次这样做。我们讨论的是在 Windows 中按“Delete”或“ShiftDelete”键意外删除重要文件夹的情况。 如果您刚刚按下删除键且未超过 30 天&#xff0c;或者尚未清空回收站&#xff0c;则可以恢复文件夹。…

操作系统学习笔记---内存管理

目录 概念 功能 内存空间的分配和回收 地址转换 逻辑地址&#xff08;相对地址&#xff09; 物理地址&#xff08;绝对地址&#xff09; 内存空间的扩充 内存共享 存储保护 方式 源程序变为可执行程序步骤 链接方式 装入方式 覆盖 交换 连续分配管理方式 单一连…

python安装与工具PyCharm

摘要&#xff1a; 周末闲来无事学习一下python&#xff01;不是你菜鸡&#xff0c;只不过是对手太强了&#xff01;所以你要不断努力&#xff0c;去追求更高的未来&#xff01;下面先了解python与环境的安装与工具的配置&#xff01; python安装&#xff1a; 官网 进入官网下载…

git 关于分支、merge、commit提交

最近开始用git终端提交代码&#xff0c;梳理了一些知识点 一 关于分支 关于分支&#xff0c;git的分支分为本地分支远程分支两种分支&#xff0c;在上传代码时&#xff0c;我们要确保当前本地分支连接了一个远程分支。 我们可以通过下面代码查看当前的本地分支&#xff1a; g…

迅为3588开发板 sudo: 无法解析主机:/DNS配置

环境申明 RK3588 ubuntu 22.04 jammy 迅为开发板 hostname 看是否有Host .&#xff0c;如果没有&#xff0c; sudo vim /etc/hostname在里面加一行&#xff0c;我这就这一个 iTOP-RK3588hosts 修改本地hosts sudo vim /etc/hosts127.0.0.1 localhost localhost iTOP-RK3…

2.postman环境变量及接口关联

一、环境变量以及全局变量 操作流程 1.点击environment 2.点击environment右侧号&#xff0c;新增环境变量 3.在变量中输入变量名以及变量值 4.回到collection页面&#xff0c;修改变量环境 5.在collection中通过{{变量名}}调用变量 变量定义 环境变量&#xff1a;环境变量…

vue 限制在指定容器内可拖拽的div

<template><div class"container" id"container"><div class"drag-box center" v-drag v-if"isShowDrag"><div>无法拖拽出容器的div浮窗</div></div></div> </template><script&g…