回答

收藏

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

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

单位如何设置、清除和切换?' e: m. D# E4 K2 g
                                                               
+ Q% X$ z% P' U4 Y    解决方案:                                                               
6 T1 y, @6 c4 k) p& {* L                                                                设置一点( )|) 设置位。
! Y5 j/ w+ W7 J; P3 d# e3 S) c3 P
    * o  M; R0 P( ?; ?: M
  • number |= 1UL 这将设置的n第 th 位number。n如果你想设置1,应该是零st 位等等n-假如你想设置nth 位。; H: k% S4 j0 b6 }. [: l7 R0 Y
  • 使用1ULLifnumber比unsigned long; 直到在评估未定义行为的位置移动超过 a 宽度后,1UL+ a* F6 G0 {! d$ N
  • 清除一点使用按位 AND 运算符 ( &) 清除位。* l; A3 T1 D2 h0 O, f" C0 h" t4 ~/ o7 p
  • [code]number &= ~(1UL 这将被清除 n第 位number。必须使用非运算符 ( ) 反转位字符串~,然后将其与。
    & t, u  a6 D8 _4 r4 c
  • 切换一下XOR 运算符 ( ^) 可用于切换位置。, k1 h% Y' [# D& F3 W) i
  • [code]number ^= 1UL 这将n切换number.- d2 B& H  f( I- [2 h
  • 检查了一下你没有要求但我不妨加。: v# [9 |$ i6 }3 K" w  \
  • 检查一下,请检查数字 n 向右移动,然后与之按位:[code]bit = (number >> n) & 1U;% ?) J# P* G( M- S" p6 |0 r
这会将n第 th 位的值number放入变量bit中。. q. _5 \9 h! o. [: N
将第n位更改为xn 2 补码 C    在实现过程中,th 位置设置为1或0,可为1或0:6 j: s1 U; S0 w# f
[code]number ^= (-x ^ number) & (1UL 如果是则该位n如果x是1,则该位将x如果x有别的价值,你会得到垃圾。x = !!x将布尔化为 0 或 1。  O6 L. ^1 f. \! n  Z
要使其独立于 2 的补码否定行为(-1设置所有位置,用 1 补码或符号/范围 C   实现不同),请使用无符号否定。
; e' V! [% ]- O' M[code]number ^= (-(unsigned long)x ^ number) & (1UL 或者; V' s3 l* Y2 b9 p
[code]unsigned long newbit = !!x;    // Also booleanize to force 0 or 1number ^= (-newbit ^ number) & (1UL 使用无符号类型进行可移植位操作通常是个好主意。
0 Q# O7 D7 B3 h% M) {( B或者
. i+ w6 X1 k3 ?8 x+ n+ y[code]number = (number & ~(1UL (number & ~(1UL * ^" y+ ]" G: B
不复制/粘贴代码通常是个好主意,所以很多人使用预处理器宏或某种包装。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则