【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,一经查实,立即删除!

相关文章

FPGA | Verilog基础语法

这里写自定义目录标题 Case语句系统任务$dumpfile | 为所要创建的VCD文件指定文件名。$dumpvar | 指定需要记录到VCD文件中的信号$fscanf$fread菜鸟教程连接 Case语句 case(case_expr)condition1 : true_statement1 ;condition2 : true_stat…

多线程(进阶二: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;使用场景和一些注意事项&…

python常见库的汇总

python常见库 一、爬虫二、界面开发三、图片处理四、视频处理、视频剪辑五、音频处理六、数据处理七、数据库八、网页开发九、神经学习、AI开发十、打包十一、Excel处理十二、微信十三、控制鼠标键盘十四、手柄十五、控制外设十六、邮箱十七、短信 一、爬虫 Requests&#xff…

Java入门项目--蚂蚁爱购

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

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

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

Tomcat使用https方式连接

Tomcat使用https方式连接 拢共分两步&#xff0c;第一步&#xff1a;生成密钥。第二步&#xff1a;修改配置。 第一步&#xff1a;生成密钥。 keytool -genkey -v -alias tomcat -keyalg RSA -validity 365 -keystore /usr/tomcat-8.5/conf/tomcat.keystore第二步&#xff1…

RocketMQ-源码架构二

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

华为机试真题 C++ 实现【字符串重新排列】

题目 给定一个字符串s&#xff0c;s包括以空格分隔的若干个单词&#xff0c;请对s进行如下处理后输出&#xff1a; 1、单词内部调整&#xff1a;对每个单词字母重新按字典序排序 2、单词间顺序调整&#xff1a; 1&#xff09;统计每个单词出现的次数&#xff0c;并按次数降序…

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

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

笔记68:Pytorch中repeat函数的用法

repeat 相当于一个broadcasting的机制 repeat(*sizes) 沿着指定的维度重复tensor。不同与expand()&#xff0c;本函数复制的是tensor中的数据。 import torch import torch.nn.functional as F import numpy as np a torch.Tensor(128,1,512) B a.repeat(1,5,1) print(B.s…

OpenGL 着色器程序的保存和加载(二进制)

背景 为了提高OpenGL 着色器程序的编译和链接速度&#xff0c;我们可以将程序保存为二进制进行加载&#xff0c;可以大幅度提升加载效率。 方法 以下是加载和保存二进制程序的方法。 // 加载着色器程序的二进制文件到已创建的着色器程序中 bool loadPragram(const std::str…

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

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

华为OD机试真题-测试用例执行计划-2023年OD统一考试(C卷)

题目描述: 某个产品当前迭代周期内有N个特性( F1,F2,.......FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用例(T1,T2......,TM ),每个用例对应了一个覆盖特性的集合,测试用例使用其ID作为下标进行标识,测试用例…

特权FPGA学习笔记

C/C/system C-----vivado HLS------------->RTL门电路&#xff0c;省去了HDL语言的中间转换&#xff0c;可以看作是C向C#的演进&#xff0c;基于zynq面向以前使用C的开发人员&#xff0c;但是个人觉得&#xff0c;HDL存在且未被C取代&#xff0c;工具的着眼点就是面向底层调…

Spring Cloud 与微服务学习总结(19)—— Spring Cloud Alibaba 之 Nacos 2.3.0 史上最大更新版本发布

Nacos 一个用于构建云原生应用的动态服务发现、配置管理和服务管理平台,由阿里巴巴开源,致力于发现、配置和管理微服务。说白了,Nacos 就是充当微服务中的的注册中心和配置中心。 Nacos 2.3.0 新特性 1. 反脆弱插件 Nacos 2.2.0 版本开始加入反脆弱插件,从 2.3.0 版本开…

飞天使-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;并不需要周期处理&…