如何将两个int类型课程ID合并存储到ulong类型变量中?
把两个32位Int合并到64位Ulong的实现方案
嘿,这个需求我太熟悉了!用位运算把两个int塞进ulong完全可行,大概率是你之前移位时没处理好类型转换的细节,导致结果不符合预期。我给你一步步讲清楚实现方法,包括合并、拆分,还有需要注意的坑:
核心思路
ulong是64位无符号整数,刚好能容纳两个32位的int(不管是有符号还是无符号)。我们只需要把第一个int放在ulong的高32位,第二个int放在低32位,通过移位和按位运算就能完成合并与拆分。
1. 合并两个Int成Ulong
这里要注意:int是有符号的,直接转ulong时会进行符号扩展(负数的最高位是1,转ulong后高位全是1),如果你的课程ID是正整数,其实影响不大,但为了严谨,我们可以先把int转成uint(无符号32位)再转ulong,避免符号扩展问题。
合并代码示例
ulong CombineTwoInts(int courseIdA, int courseIdB) { // 把第一个ID转成uint再转ulong,左移32位,占据高32位 ulong highPart = (ulong)(uint)courseIdA << 32; // 第二个ID转成uint再转ulong,占据低32位 ulong lowPart = (ulong)(uint)courseIdB; // 按位或运算合并两部分 return highPart | lowPart; }
如果你的课程ID确定都是非负数,也可以简化成:
ulong CombineTwoInts(int courseIdA, int courseIdB) { return ((ulong)courseIdA << 32) | (uint)courseIdB; }
2. 从Ulong拆分回两个Int
拆分就是合并的逆操作:右移32位取出高32位,再通过按位与0xFFFFFFFF取出低32位,最后转成int即可。
拆分代码示例
void SplitUlongToInts(ulong combinedValue, out int courseIdA, out int courseIdB) { // 右移32位得到高32位,转成uint再转int courseIdA = (int)(uint)(combinedValue >> 32); // 取低32位,转成uint再转int courseIdB = (int)(uint)(combinedValue & 0xFFFFFFFF); }
完整使用示例
// 初始化你的字典 var studentCourseMap = new Dictionary<int, ulong>(); // 模拟学生ID和两门课程ID int studentId = 1234; int mathCourseId = 5678; int englishCourseId = 9012; // 合并并存入字典 ulong combinedCourses = CombineTwoInts(mathCourseId, englishCourseId); studentCourseMap.Add(studentId, combinedCourses); // 从字典取出并拆分 if (studentCourseMap.TryGetValue(studentId, out ulong value)) { SplitUlongToInts(value, out int retrievedMath, out int retrievedEnglish); Console.WriteLine($"学生{studentId}的课程:数学{retrievedMath},英语{retrievedEnglish}"); }
关键注意事项
- 如果你的课程ID可能是负数(虽然业务上不太可能),一定要通过
uint中转,否则符号扩展会导致合并后的数据错误。 - 移位操作时,必须先把int转成ulong再移位,否则int的移位会触发有符号移位(负数右移会补1),导致结果错误。
内容的提问来源于stack exchange,提问作者Harshil Doshi
相关产品推荐
相关产品推荐

