【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.pswp.cn/news/211313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211313.shtml
英文地址,請注明出處:http://en.pswp.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;并不需要周期處理&…