回答

收藏

如何设置、清除和切换单个位?

技术问答 技术问答 236 人阅读 | 0 人回复 | 2023-09-12

单位如何设置、清除和切换?+ G$ z2 I. p( I
                                                                ) K5 E% T1 C2 y5 Z
    解决方案:                                                               
; ~" R/ h* v4 k! f5 K$ X                                                                设置一点( )|) 设置位。, T6 W0 T0 H8 ?' k0 X

      m. G0 |9 S) |8 S  Y! C
  • number |= 1UL 这将设置的n第 th 位number。n如果你想设置1,应该是零st 位等等n-假如你想设置nth 位。& f! w& Q3 w) I% c; t
  • 使用1ULLifnumber比unsigned long; 直到在评估未定义行为的位置移动超过 a 宽度后,1UL) Z4 Z6 X* G3 e5 p2 R  q% G
  • 清除一点使用按位 AND 运算符 ( &) 清除位。
    9 A- x. f$ z0 u) ~6 v" w
  • [code]number &= ~(1UL 这将被清除 n第 位number。必须使用非运算符 ( ) 反转位字符串~,然后将其与。
    9 g8 \! H& L$ ]7 H0 ?/ t) X
  • 切换一下XOR 运算符 ( ^) 可用于切换位置。, e6 d6 L8 G/ Z( ~' |- i
  • [code]number ^= 1UL 这将n切换number.( U% I$ T/ X5 I, f
  • 检查了一下你没有要求但我不妨加。
    ( Q7 |" U: k4 H5 _3 ^' ]
  • 检查一下,请检查数字 n 向右移动,然后与之按位:[code]bit = (number >> n) & 1U;
    5 \) |7 S2 i1 ~1 |' M$ H( O5 T
这会将n第 th 位的值number放入变量bit中。
& Q$ [$ t: ^  p2 b6 R将第n位更改为xn 2 补码 C    在实现过程中,th 位置设置为1或0,可为1或0:
3 `5 S% L& z* T4 g0 [- |0 A[code]number ^= (-x ^ number) & (1UL 如果是则该位n如果x是1,则该位将x如果x有别的价值,你会得到垃圾。x = !!x将布尔化为 0 或 1。/ c8 V' i2 ^* `" y: D7 v' w* Y/ @
要使其独立于 2 的补码否定行为(-1设置所有位置,用 1 补码或符号/范围 C   实现不同),请使用无符号否定。4 `' b, e$ [( |! g8 Y9 u! E! E! a* O
[code]number ^= (-(unsigned long)x ^ number) & (1UL 或者
+ |0 X3 Y: A5 z5 i9 ^. |0 \! }[code]unsigned long newbit = !!x;    // Also booleanize to force 0 or 1number ^= (-newbit ^ number) & (1UL 使用无符号类型进行可移植位操作通常是个好主意。. C) I, q" H# ^
或者# {% G) x1 g9 j- A
[code]number = (number & ~(1UL (number & ~(1UL 5 n7 e7 I: ~: r
不复制/粘贴代码通常是个好主意,所以很多人使用预处理器宏或某种包装。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则