C#中如何用位运算将4个int唯一存储到单个int并取回?
用位运算合并/拆分多个int变量的实现方案
你的思路方向完全正确!用移位+加法(或位或)把多个小范围int合并到一个32位int里是可行的,但有几个关键细节要注意,同时还要掌握反向拆分的方法:
一、合并变量的正确姿势
你的写法int whole = a + (b << 8) + (c << 16) + (d << 24);本身没问题,但有个核心前提:a、b、c、d的取值必须在0~255之间(也就是每个变量占8位)。因为32位int刚好能拆成4个独立的8位段,只要每个变量不超过8位的最大值,移位后就不会和其他段的二进制位重叠,这样whole就会是唯一对应这四个值的结果,不会有冲突。
更推荐用**位或(|)**代替加法,可读性更强,也能避免极端情况下的进位问题(虽然值不超8位时加法结果一样):
int a = 4; int b = 5; int c = 6; int d = 7; int whole = a | (b << 8) | (c << 16) | (d << 24);
二、从whole中拆分出原变量
要取回每个值,需要用**位与(&)**配合移位操作,提取对应位置的8位段:
- 提取a(最低8位):
int a = whole & 0xFF;(0xFF是8位全1的十六进制数,按位与后会保留whole的最低8位,也就是原来的a) - 提取b(第2个8位段):
int b = (whole >> 8) & 0xFF;(先把whole右移8位,把b的位段移到最低8位,再用0xFF过滤) - 提取c(第3个8位段):
int c = (whole >> 16) & 0xFF;(右移16位后过滤) - 提取d(最高8位):
int d = (whole >> 24) & 0xFF;(右移24位后过滤)
三、针对你给出的例子:whole = 5919835,提取c的值
我们直接用拆分c的公式计算:
- 先把whole右移16位:
5919835 >> 16 = 90(因为2^16=65536,5919835 ÷ 65536的整数部分是90) - 再和0xFF按位与:
90 & 0xFF = 90
所以这个whole对应的c值是90。
重要注意事项
- 如果你的变量值可能超过255,这种8位分段的方式就不行了,会导致二进制位重叠丢失数据。这时需要调整每个变量分配的位数(比如给每个变量16位,那只能存2个变量到32位int里)。
- 尽量用
unsigned int来存储whole,避免有符号int的最高位符号位干扰(比如d的值大于127时,whole会变成负数,拆分时需要额外处理符号位)。
内容的提问来源于stack exchange,提问作者user13211127
相关产品推荐
相关产品推荐

