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

news2024/12/17 2:46:13

文章目录

  • 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 对应十进制数 36

    unsigned 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.coloradmin.cn/o/1299333.html

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

相关文章

边缘计算系统设计与实践:引领科技创新的新浪潮

文章目录 一、边缘计算的概念二、边缘计算的设计原则三、边缘计算的关键技术四、边缘计算的实践应用《边缘计算系统设计与实践》特色内容简介作者简介目录前言/序言本书读者对象获取方式 随着物联网、大数据和人工智能等技术的快速发展&#xff0c;传统的中心化计算模式已经无法…

用php和mysql制作一个网站

当使用PHP和MySQL制作网站时&#xff0c;我们可以利用PHP的强大功能来与MySQL数据库进行交互&#xff0c;从而实现动态网页的创建和数据存取。下面是一个关于如何使用PHP和MySQL制作网站的简单说明&#xff0c;以及一些示例代码。 ​ 1、R5Ai智能助手 chatgpt国内版本 :R5Ai智…

P7 Linux C三种终止进程的方法

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《 链表_Chen…

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

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

机器人、智能小车常用的TT电机/310电机/370电机选型对比

在制作智能小车或小型玩具时&#xff0c;在电机选型上一些到各种模糊混淆的概念&#xff0c;以及各种错综复杂的电机参数&#xff0c;本文综合对比几种常用电机的参数及特性适应范围&#xff0c;以便快速选型&#xff0c;注意不同生产厂家的电机参数规则会有较大差异。 普通TT…

2023.12.09小爆发(31.56元) 穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益

接入穿山甲SDK的app 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 2023.12.09 广告收入有31.56R,小爆发了一下 1.用户统计上图&#xff1a; 昨天新增…

揭秘字符串的奥秘:探索String类的深层含义与源码解读

文章目录 一、导论1.1 引言&#xff1a;字符串在编程中的重要性1.2 目的&#xff1a;深入了解String类的内部机制 二、String类的设计哲学2.1 设计原则&#xff1a;为什么String类如此重要&#xff1f;2.2 字符串池的概念与作用 三、String类源码解析3.1 成员变量3.2 构造函数3…

【小聆送书第二期】人工智能时代之AIGC重塑教育

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;正文&#x1f4dd;活动参与规则 参与活动方式文末详见。 &#x1f4cb;正文 AI正迅猛地…

倪海厦:教你正确煮中药,发挥最大药效

同样的一个汤剂&#xff0c;我开给你&#xff0c;你如果煮的方法不对&#xff0c;吃下去效果就没那么好。 所以&#xff0c;汤&#xff0c;取它的迅捷&#xff0c;速度很快&#xff0c;煮汤的时候还有技巧&#xff0c;你喝汤料的时候&#xff0c;你到底是喝它的气&#xff0c;…

自动驾驶学习笔记(十六)——目标跟踪

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 匹配关联 轨迹记录 状态预测 总结 前…

Stable Diffusion AI绘画系列【22】:国风美女写实系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

面向 AI 开发者的新型编程语言Mojo

文章目录 面向 AI 开发者的新型编程语言Mojo一、什么是mojoLLVMMLIR为什么选择Mojo&#x1f525; 二、Mojo安装系统要求安装步骤Mojo Visual Studio Code (VS Code) 扩展 安装 三、官方hello world交互式运行构建和运行Mojo源文件构建可执行的二进制 四、Mojo语言基础Mojo 语言…

微服务学习:Nacos配置中心

先打开Nacos&#xff08;详见微服务学习&#xff1a;Nacos微服务架构中的服务注册、服务发现和动态配置&Nacos下载&#xff09; 1.环境隔离&#xff1a; 新建命名空间&#xff1a; 记住命名空间ID&#xff1a; c82496fb-237f-47f7-91ed-288a53a63324 再配置 就可达成环…

智能仪表板DevExpress Dashboard v23.1 - 支持自定义样式创建

使用DevExpress Analytics Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设…

LeetCode(53)逆波兰表达式求值【栈】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 逆波兰表达式求值 1.题目 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操…

vs2017+qt5.14.2遇到的问题

1、在安装qt插件后&#xff0c;导入pro文件时&#xff0c;报 msvc-version.conf loaded but QMAKE_MSC_VER isn’t set 修改E:\Qt\Qt5.14.2\5.14.2\msvc2017_64\mkspecs\common\msvc-version.conf文件中添加

了解一下分治算法

文章目录 分治算法 分治算法 分治算法基本介绍 分治法&#xff08;Divide-and-Conquer&#xff09;是一种很重要的算法。字面上的解释是"分而治之"&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直…

LeetCode力扣每日一题(Java):27、移除元素

一、题目 二、解题思路 1、我的思路 因为题目中说“元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。”也就是说&#xff1a; 输入&#xff1a;nums [3,2,2,3], val 3 输出&#xff1a;2, nums [2,2] 解释&#xff1a;函数应该返回新的长度 2并且 nums 中的…

php循环遍历删除文件下文件和目录

前言 今天在写一个demo的时候需要循环删除目录下文件。如下想删temp下文件和目录。 具体实现 private function deleteDir($dirPath){if (is_dir($dirPath)) {$contents scandir($dirPath);// 如果是空目录if (count($contents) 2) {rmdir($dirPath);return;}// 不是空目录f…

三菱FX系列PLC的无线通讯方案

产品型号&#xff1a;NET30-FX-W4 使用范围&#xff1a;用于三菱FX3U/3G/3S/2N/1N/1S等系列PLC通讯扩展 1、产品介绍 工业通讯桥接器&#xff08;NET30-FX-W4&#xff09;用于三菱FX系列PLC&#xff08;FX3U/3G/3S/2N/1N/1S&#xff09;以及汇川、禾川等PLC的通讯扩展&#x…