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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:44:51