标题:循环移位(C++)
只看楼主
飞逝的流年
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2020-8-27
结帖率:0
已结贴  问题点数:20 回复次数:1 
循环移位(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
搜索更多相关主题的帖子: 循环 C++ 右移 移位 按位或 
2020-08-27 20:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
根据你的文字描述,并改掉其中明显的错误,再添加出题者没注意到的细节,代码如下:
    n = (n%16+16)%16; // 确保 n 在 [0,16) 范围内,否则其移位动作是“未定义行为”。
    uint16_t b = a<<(16-n); // 将a右端n位放到b中的高n位中
    uint16_t c = a>>n; // 将a左端16-n位放到c中的低16-n位中
    c = c|b; // 合并b和c

事实上C++20标准中已经有 std::rotr 函数了,完全不用自己写。

以下是测试代码:
程序代码:
#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 );
}
2020-08-28 09:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502976-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018926 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved