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

2023-12-13 18:57:08


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

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码转换中的应用,包括移位操作、按位与、按位或、按位取反等操作。这些位运算操作可以快速高效地处理二进制数据,有助于提高程序的性能和效率。

文章来源:https://blog.csdn.net/Colorful___/article/details/134905953
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。