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
相关产品推荐
相关产品推荐

