转载 C++用位运算实现循环移位

C++用位运算实现循环移位

循环移位区别于一般移位的是移位时没有数位的丢失。

循环左移时,用从左边移出的位填充字的右端。

循环右移时,用从右边移出的位填充字的左侧。

这种情况在系统程序中时有使用,在一些控制程序中用得也不少。

例如:

a = 01111011,循环左移2位的正确结果是: b=11101101

b = a >> (8 - 2);  //用来得到正常左移丢失的位和循环移位后其正确位置  //b=00000001;

a = a << 2;  //a = 11101100

a = a | b;  //a = 11101101

如果不是用中间变量 a=(a>>(8-2))|(a<<2)

通用:

总长度N(8 16 32)

循环左移n (a >> (N - n)) | (a >> n)

循环右移n (a << (N - n)) | (a >> n)

时间: 2024-10-01 00:21:14

转载 C++用位运算实现循环移位的相关文章

位运算(转载)

12 位运算 C语言是为描述系统设计的,因此它应该具有汇编语言所以完成的一些功能.C语言既有高级语言的特点,又具有低级语言的功能.因而具有广泛的用途和很强的生命力. 12.1 位运算符和位运算 运算符 含义 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 说明: (1)位运算符中除 ~ 外,均为二目运算符,即要求出侧各有一个运算量. (2)运算早只能是整型或字符型的数据,不能为实型数据. 12.1.1 按位与运算符 & 参加运算的两个数制,按

C语言位运算详解(转载)

转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型.C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结

HDU4149 Magic Potion(位运算)

题目请戳这里 题意:给出x1,x2,x3,x4,x5,x6,x7,x8与某值m进行异或运算后的结果,再给出x1~x8之和与m进行异或运算后的结果sum,求m. 思路: 根据位运算特性来做,由于m最大为32位,我们可以从最低位依次来推理得到,用x>>i&1来取右数第i-1位的值. 假设二进制右起第一位是1,算出所有xi的右起第一位二进制结果,累加得到tmp,比较tmp与sum的最右位,符合则m最右位为1,否则为0: 于是x1~x8的二进制最右位已求出,累加求进位依次类推. 很有意思的一道

Codeforces 558C Amr and Chemistry(数论+位运算)

C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experiment. Amr has n differ

基本位运算

1.位基本操作符: 与 & 或 | 非 异或 ^ 移位 >>.<< 2.应用: 1.判断一个数是不是4的次幂  ( (x & (x - 1)) == 0 ) && ( (x & 0x55555555) == x)   2.获取负数  -x = (~x + 1) 3.交换两个数 int a, b; a = a ^ b; b = a ^ b; a = a ^ b; 4.循环移位 (a << k) | ( a >> (32

Matlab位运算笔记

本文为转载其他地方的文章; MATLAB函数 1.matlab函数bitset 设置数的某一位二进制位为1. <Simulink与信号处理> 使用方法 C = bitset(A,bit) 将数A的第bit二进制位设为1. C = bitset(A,bit,V) <Simulink与信号处理> 将数A的第bit二进制位设为V,V必须为0或1. 应用举例 例1: . C = bitset(uint8(9),5) C = 25 将数字9(01001)的第5位设为1,C的二进制位11001

POJ 3220 位运算+搜索

转载自:http://blog.csdn.net/lyhypacm/article/details/5813634 DES:相邻的两盏灯状态可以互换,给出初始状态.询问是否能在三步之内到达.如果能的话.输出不属.超出3步就输出more. 貌似典型应用是位压缩.我觉得各种按位运算用的也很巧妙.判断两盏灯是不是状态一样的时候,和交换状态的时候.先广搜一遍,保存到达各种状态的最短路径,然后查询就可以了. 1 #include<iostream> 2 #include<cstdio> 3

[leetcode] Bitwise AND of Numbers Range(位运算)

不得不说位运算的应用都是很巧妙的. 这道题求一个连续区间整数的与运算的值,突破点在于连续的区间这个特点.我们可以先找几个数看一下规律, 2 3 4 5的二进制分别是 10 ,11,100,101,可以发现若m==n,则m为答案:当m!=n时,因为连续的两个数的二进制 的最后一位肯定不一样,与的值一定是0,前面相同的部分(1&1=1,0&0=0)保持. 所以我们每次先判断,不同的话就右移一位,比较前面的,直到相同的时候结束,最后左移  移动的位数. 不必担心左移的时候有1会导致溢出,从而失败

深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer6.html 布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运算分别是或.与.非和异或.下图展示了在布尔代数的知识体系中,对这四种运算的定义. 从左至右依次是非.与.或以及异或.这个图阐述的是针对一位二进制的运算结果,我们可以将其扩大到N位二进