回答

收藏

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

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

单位如何设置、清除和切换?4 W3 F7 K& z& }/ j
                                                                4 C3 r8 m, F1 w9 t+ I" f+ s& l
    解决方案:                                                                : I4 O+ I  W3 i5 w1 Q) D  N
                                                                设置一点( )|) 设置位。
1 Z4 y) I' V% p8 ~9 d* }& U& }9 h
    0 z: s- V+ s5 T( }! z. k& }
  • number |= 1UL 这将设置的n第 th 位number。n如果你想设置1,应该是零st 位等等n-假如你想设置nth 位。
    * H9 n! ^1 w: N) V( c2 {
  • 使用1ULLifnumber比unsigned long; 直到在评估未定义行为的位置移动超过 a 宽度后,1UL
    1 ], h) H, }' ^* m0 w3 {
  • 清除一点使用按位 AND 运算符 ( &) 清除位。
      P# @$ ~+ M% O( ~6 h4 o
  • [code]number &= ~(1UL 这将被清除 n第 位number。必须使用非运算符 ( ) 反转位字符串~,然后将其与。* m* {; m& G6 u" `9 d1 e) k; Q+ B
  • 切换一下XOR 运算符 ( ^) 可用于切换位置。
    " G$ A2 [; T% m5 Z) ~; j+ _- b  ]
  • [code]number ^= 1UL 这将n切换number.
    1 f' Y4 R3 u  a; V' h$ f
  • 检查了一下你没有要求但我不妨加。
      Y* s0 G8 R. A
  • 检查一下,请检查数字 n 向右移动,然后与之按位:[code]bit = (number >> n) & 1U;
    : q# T' W, Q) O% Y
这会将n第 th 位的值number放入变量bit中。
- a) d6 ?; X- ~7 S: _将第n位更改为xn 2 补码 C    在实现过程中,th 位置设置为1或0,可为1或0:+ {* n  K- K, ]$ ]) G/ O
[code]number ^= (-x ^ number) & (1UL 如果是则该位n如果x是1,则该位将x如果x有别的价值,你会得到垃圾。x = !!x将布尔化为 0 或 1。
* |( f+ G1 i0 q9 s- E! i8 j要使其独立于 2 的补码否定行为(-1设置所有位置,用 1 补码或符号/范围 C   实现不同),请使用无符号否定。
4 V# @5 N+ k7 W' v' Y[code]number ^= (-(unsigned long)x ^ number) & (1UL 或者5 ^4 R3 U$ J7 l- n! [: v
[code]unsigned long newbit = !!x;    // Also booleanize to force 0 or 1number ^= (-newbit ^ number) & (1UL 使用无符号类型进行可移植位操作通常是个好主意。
0 _( \$ h' ^% T" W' J或者! C  l3 |8 N- X; j( T/ W% f6 d
[code]number = (number & ~(1UL (number & ~(1UL ) y7 G, v) r4 \7 G3 F
不复制/粘贴代码通常是个好主意,所以很多人使用预处理器宏或某种包装。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则