P1100 高低位交换[洛谷AC]

文章讲述了在解决洛谷问题中,通过利用无符号整数的位运算技巧,实现高效简洁的高位交换代码,并分享了AC解决方案。

  题目传送门——高低位交换 - 洛谷

思路

一开始费劲巴拉想出一堆代码,还RE了,直到知道无符号整数的位运算。。。

AC代码 

#include <cstdio>
using namespace std;
int main()
{
    unsigned long long a;
    cin>>a;
    cout<<(a>>16)+(a<<16)<<endl;//位运算
    return 0;
}

 

高低位交换是在编程中,尤其是嵌入式编程里常遇到的操作,其目的是将数据的高位和低位进行互换。 ### 原理 在计算机中,数据以二进制形式存储,每个二进制位代表不同的权重。高低位交换就是把数据的高权重位和低权重位进行对调。例如,对于一个8位二进制数,将左边的4位和右边的4位进行交换;对于16位二进制数,则是把左边的8位和右边的8位进行交换。 ### 实现方法 #### 8位数据高低位转换 以下是8位数据高低位转换的C语言代码示例: ```c #include <stdio.h> unsigned char highAndLowShiftHEX(unsigned char data); void printBin(int n); int main() { highAndLowShiftHEX(209); return 0; } unsigned char highAndLowShiftHEX(unsigned char data) { unsigned char i; unsigned char tmp = 0x00; for (i = 0; i < 8; i++) { tmp = ((data >> i) & 0x01) | tmp; if (i < 7) tmp = tmp << 1; } printf("\nafter shift data:"); printBin(tmp); return tmp; } // 打印二进制的函数 void printBin(int n) { int len = sizeof(n) * 8; int i; if (n == 0) { printf("0"); return; } for (i = len - 1; i >= 0; i--) { if (n & (1 << i)) break; } for (; i >= 0; i--) printf("%d", (n & (1 << i)) != 0); } ``` 此代码通过循环逐位处理8位数据,将每一位提取出来并重新组合,实现高低位交换 [^2]。 #### 16位数据高低位转换 下面是16位数据高低位转换的C语言代码示例: ```c #include <stdio.h> void expandPrintBin(int val2); unsigned short HighAndLowSwitchHEX(unsigned short data); int main() { HighAndLowSwitchHEX(38491); return 0; } // 扩展的打印二进制的函数 void expandPrintBin(int val2) { int i, k; unsigned char *p = (unsigned char *)&val2 + 3; for (k = 0; k <= 3; k++) { int val2 = *(p - k); for (i = 7; i >= 0; i--) { if (val2 & (1 << i)) printf("1"); else printf("0"); } printf(" "); } } unsigned short HighAndLowSwitchHEX(unsigned short data) { unsigned char i = 0; unsigned short temp = 0x0000; for (i = 0; i < 16; i++) { temp = ((data >> i) & 0x0001) | temp; if (i < 15) { temp = temp << 1; } } printf("temp:%x\n\n", temp); expandPrintBin(temp); return temp; } ``` 该代码采用类似的循环逐位处理方式,对16位数据进行高低位交换 [^3]。 ### 总结 交换字节的高低位需要对C语言位操作有熟练的掌握。遇到这类问题时,要仔细分析,通过合理运用位运算符(如`>>`、`<<`、`&`、`|`)来实现高低位交换 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值