如何用C#通过最多两次操作翻转整数中的特定标志位
如何用C#通过最多两次操作翻转整数中的特定标志位
嘿,我来帮你搞定这个位操作的需求!你要在整数里处理两个独立的位翻转规则,而且最多用两次操作对吧?咱们先把需求再理清楚:
- 规则1:如果第3位(从0开始计数,对应
2^3=8的位置)是1,就把它设为0,同时把第2位(2^2=4)设为1 - 规则2:如果第5位(
2^5=32)是1,就把它设为0,同时把第4位(2^4=16)设为1 - 所有其他位保持不变,两个规则互不影响
其实根本不需要写if判断,用纯位操作就能搞定,而且刚好两次操作就能覆盖两个规则,甚至还能合并成一次操作。
分步解决方案(两次操作)
直接针对每个规则写位操作代码就行,逻辑清晰,容易理解:
// 处理规则1:检查bit3,满足条件则翻转对应位 int result = input; result = (result & ~(1 << 3)) | ((result & (1 << 3)) >> 1); // 处理规则2:检查bit5,满足条件则翻转对应位 result = (result & ~(1 << 5)) | ((result & (1 << 5)) >> 1);
我给你拆解下每部分的作用:
1 << 3:生成只有bit3为1的掩码(二进制1000)result & ~(1 << 3):把result的bit3强制设为0,其他位保持不变(result & (1 << 3)) >> 1:如果原来的bit3是1,右移一位就得到bit2为1的值;如果是0,结果就是0- 最后用
|把这两部分合并,就实现了“bit3为1时,清bit3并置bit2为1,否则无变化”的效果
规则2的逻辑完全一样,只是把位编号从3换成5而已。
合并成一次操作(可选)
如果你想更紧凑,也可以把两个操作合并成一行,因为两个规则操作的位不重叠,互相独立:
int result = ((input & ~(1 << 3)) | ((input & (1 << 3)) >> 1)) & ((input & ~(1 << 5)) | ((input & (1 << 5)) >> 1));
验证你的测试场景
咱们用你给的输入来验证下:
- input_01(
0b_10101010_10_10_1):经过两次操作后,bit3清0、bit2置1,bit5清0、bit4置1,刚好得到expected_01 - input_02(
0b_10101010_00_10_1):只有bit3满足规则1,处理后bit3清0、bit2置1,得到expected_02 - input_03(
0b_10101010_10_00_1):只有bit5满足规则2,处理后bit5清0、bit4置1,得到expected_03 - input_04(
0b_10101010_01_01_1):两个规则都不满足,处理后和原数一致,符合expected_04
这样不管哪种场景,都能完美符合你的预期,而且操作次数最多两次,完全满足要求~
备注:内容来源于stack exchange,提问作者Cedric Royer-Bertrand
相关产品推荐
相关产品推荐

