位操作——高低位交换(循环左移/右移)

给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为:

10000110 11011000

将它的高低位进行交换,我们得到了一个新的二进制数:

11011000 10000110

它即是十进制的55430。

这个问题用位操作解决起来非常方便,设x=34520=10000110 11011000(二进制) 由于x为无符号数,右移时会执行逻辑右移即高位补0,因此x右移8位将得到0000000010000110。

而x左移8位将得到11011000 00000000。可以发现只要将x>>8与x<<8这两个数相或就可以得到11011000 10000110。用代码实现非常简洁:

x = (x>>8)|(x<<8)

扩展到一搬情形:

设sizeof(int)=32;

无符号整型变量循环右移k次的结果为:

a0a1......a               a31-k+1a31-k......a30a31a0.......a31-k

x = (x << 32-k) | (x >> k);

无符号整型变量循环左移k次的结果为:

x = (x >> 32-k) | (x << k);

时间: 2024-10-15 07:22:12

位操作——高低位交换(循环左移/右移)的相关文章

洛谷 P1100 高低位交换 题解

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1100 题目描述 给出一个小于2^32的正整数.这个数可以用一个32位的二进制数表示(不足32位用0补足).我们称这个二进制数的前16位为“高位”,后16位为“低位”.将它的高低位交换,我们可以得到一个新的数.试问这个新的数是多少(用十进制表示). 例如,数1314520用二进制表示为0000 0000 0001 0100 0000 1110

洛谷——P1100 高低位交换

P1100 高低位交换 题目描述 给出一个小于2^32的正整数.这个数可以用一个32位的二进制数表示(不足32位用0补足).我们称这个二进制数的前16位为“高位”,后16位为“低位”.将它的高低位交换,我们可以得到一个新的数.试问这个新的数是多少(用十进制表示). 例如,数1314520用二进制表示为0000 0000 0001 0100 0000 1110 1101 1000(添加了11个前导0补足为32位),其中前16位为高位,即0000 0000 0001 0100:后16位为低位,即00

P1100 高低位交换

题目描述 给出一个小于2^{32}232的正整数.这个数可以用一个3232位的二进制数表示(不足3232位用00补足).我们称这个二进制数的前1616位为“高位”,后1616位为“低位”.将它的高低位交换,我们可以得到一个新的数.试问这个新的数是多少(用十进制表示). 例如,数13145201314520用二进制表示为0000 0000 0001 0100 0000 1110 1101 100000000000000101000000111011011000(添加了1111个前导00补足为323

C语言之linux内核实现位数高低位互换

linux内核实在是博大精深,有很多优秀的算法,我之前在工作中就遇到过位数高低位交换的问题,那时候对于C语言还不是很熟练,想了很久才写出来.最近在看内核的时候看到有内核的工程师实现了这样的算法,和我之前想的一样,那么今天就把它分享出来吧. 在开发需求中,有要实现32位.16位.8位数高低位交换的算法.那么我们具体看看代码实现: 还是一样,从linux内核中将代码抠出来: #include <stdio.h> //将一个8位数高低4位交换 static inline unsigned char

C语言实现按位循环左移和循环右移

ror eax,cl ==> eax=(eax>>cl)+(eax<<(sizeof(eax)-cl)); rol eax,cl ==> eax=(eax<<cl)+(eax>>(sizeof(eax)-cl)); C语言实现按位循环左移和循环右移

嵌入式C开发---用循环实现左移右移

//将n左移m位 int byte_to_left_move(int n , int m) { int i , ret = 1 ; if(n == 0 || n < 0) { return ; } if(n == 1) { for(i = 0 ; i < m ; i++) ret *= n * 2 ; } if(n > 1) { for(i = 0 ; i < m ; i++) ret *= n ; } return ret ; } //将n右移m位 int byte_to_rig

用C语言实现循环左移和循环右移

有天重建一段代码时,遇到了循环右移指令,不知道用C语言怎么实现,后来得到小伟指点,感谢.. me 15:56:38004BD2C9 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]004BD2CC D1CA     ROR EDX,1004BD2CE 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX me 15:57:16这样的汇编,怎么用C语言写出来呢?ROR循环右移 小伟 15:58:51等等,翻笔记中. 小伟 15:59:06#define

二进制高低位逆转

编写一个函数,实现将一个32位int 型数据的二进制高位到低位的逆变,例如:1101 0101 变成 1010 1011 . 例举两种方法: 方法1. 再定义一个变量,通过移位运算和位与将高位到低位实现逆序.但不足之处是效率低,需要进行332次移位和运算. int func1(unsigned int uiData,int length){      unsigned int uiValue = 0;    int i = 0;    for(i=0;i<length;i++)    {    

《编程珠玑》笔记:数组循环左移

问题描述:数组元素循环左移,将包含 num_elem 个元素的一维数组 arr[num_elem] 循环左移 rot_dist 位.能否仅使用数十个额外字节的存储空间,在正比于num_elem的时间内完成数组的旋转? 一:Bentley's Juggling Alogrithm 移动变量 arr[0] 到临时变量 tmp,移动 arr[rot_dist] 到 arr[0],arr[2rot_dist] 到 arr[rot_dist],依此类推,直到返回到取 arr[0] 中的元素,此时改为从 t