循环移位(C++)
程序编写循环移位
要将a进行右循环移位,即a右循环n位,将a中原来左边(16-n)位右移n位。现假设2个字节存放一个整数。
考虑如下操作
(1) 先将a右端n位,放到b中的高n位中,即b=a<<(16-n)
(2) 先将a右端n位,其左边高位n位补0,即c=a<<n
(3) 将c与b进行按位或运算,即c=c|b
#include <cstdint> uint16_t my_rotr( uint16_t a, int n ) // 这是根据你题目要求写的实现 { n = (n%16+16)%16; return (a<<(16-n)) | (a>>n); } #include <bit> #include <bitset> #include <iostream> #include <cassert> void test( uint16_t a, int n ) { uint16_t result = my_rotr(a,n); std::cout << std::bitset<16>(a) << "循环右移" << n << "位,得 " << std::bitset<16>(result); if( result != std::rotr(a,n) ) // 将自己写的函数结果与C++自带的函数结果比较 std::cout << " --- 结果错误"; std::cout << std::endl; } int main( void ) { test( 0b0000000000001111, 4 ); test( 0b1111111111110000, 4 ); test( 0b1000000000001000, 4 ); test( 0b0000000000001111, 20 ); test( 0b1111111111110000, 20 ); test( 0b1000000000001000, 20 ); test( 0b0000000000001111, -28 ); test( 0b1111111111110000, -28 ); test( 0b1000000000001000, -28 ); }