You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何原地旋转std::uint64_t类型十六进制数的前k位

实现C++中std::uint64_t前k个十六进制数位的旋转

可以仅通过位操作实现,无需拆分出left和right两个中间变量,直接通过位运算组合完成旋转逻辑。以下是针对不同旋转需求的实现:

1. 前k位循环左移一个十六进制数位(最高数位移到前k位的最低位)

#include <cstdint>

std::uint64_t rotate_left_first_k_hex(std::uint64_t hex, int n, int k) {
    const int digit_bits = 4; // 每个十六进制数位占4bit
    const int total_bits = n * digit_bits;
    const int right_part_bits = (n - k) * digit_bits;

    // 提取前k位的最高数位
    std::uint64_t top_digit = (hex >> (total_bits - digit_bits)) & 0xF;
    // 整体左移一个数位,保留前n位有效范围,再将top_digit放到前k位的最低位置
    return ((hex << digit_bits) & ((1ULL << total_bits) - 1)) | (top_digit << right_part_bits);
}

2. 前k位循环右移一个十六进制数位(最低数位移到前k位的最高位)

#include <cstdint>

std::uint64_t rotate_right_first_k_hex(std::uint64_t hex, int n, int k) {
    const int digit_bits = 4;
    const int total_bits = n * digit_bits;
    const int right_part_bits = (n - k) * digit_bits;

    // 提取前k位的最低数位
    std::uint64_t bottom_digit = (hex >> right_part_bits) & 0xF;
    // 整体右移一个数位,将bottom_digit放到前k位的最高位置,再保留前n位有效范围
    return ((hex >> digit_bits) | (bottom_digit << (total_bits - digit_bits))) & ((1ULL << total_bits) - 1);
}

3. 匹配你示例的首尾数位交换(前k位的第一个和最后一个数位交换)

你的示例中0x436512(n=6,k=3)变为0x634512,本质是前3位的首尾数位交换,实现代码如下:

#include <cstdint>

std::uint64_t swap_first_last_of_k_hex(std::uint64_t hex, int n, int k) {
    const int digit_bits = 4;
    const int total_bits = n * digit_bits;
    const int right_part_bits = (n - k) * digit_bits;
    const int first_digit_pos = total_bits - digit_bits;

    // 提取前k位的第一个和最后一个数位
    std::uint64_t first_digit = (hex >> first_digit_pos) & 0xF;
    std::uint64_t last_k_digit = (hex >> right_part_bits) & 0xF;

    // 清除原位置的数位,再交换赋值
    hex &= ~((0xFULL << first_digit_pos) | (0xFULL << right_part_bits));
    hex |= (last_k_digit << first_digit_pos) | (first_digit << right_part_bits);
    return hex;
}

关键说明

  • 所有操作均基于位运算完成,无需额外中间变量存储拆分后的左右部分
  • 1ULL 用于避免32位整数溢出,确保在64位环境下正确计算
  • ((1ULL << total_bits) - 1) 用于生成掩码,保留前n个十六进制数位的有效范围,避免移位后引入多余高位

内容的提问来源于stack exchange,提问作者asdasdqwer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:50:39