gpt4 book ai didi

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

转载 作者:bug小助手 更新时间:2023-10-28 01:29:45 25 4
gpt4 key购买 nike

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

最佳答案

设置一点

使用按位或运算符 (|) 设置位。

number |= 1UL << n;

这将设置 n number的第. n如果要设置 1,则应为零。 st 位等直到 n-1 , 如果要设置 n第一点。

使用 1ULL如果 numberunsigned long 更宽;推广1UL << n直到评估 1UL << n 之后才会发生如果移动超过 long 的宽度是未定义的行为.这同样适用于所有其他示例。

清理一下

使用按位与运算符 (&) 清除位。

number &= ~(1UL << n);

这将清除 n number的第.您必须使用按位 NOT 运算符 ( ~ ) 反转位字符串,然后进行 AND。

稍微切换

XOR 运算符 (^) 可用于切换位。

number ^= 1UL << n;

这将切换 n number的第.

检查一下

这不是你要求的,但我不妨添加它。

要检查一下,将数字 n 向右移动,然后按位与它:

bit = (number >> n) & 1U;

这将把 n 的值number的第进入变量 bit .

将第 n 位更改为 x

设置n位到 10可以在 2 的补码 C++ 实现上通过以下方式实现:

number ^= (-x ^ number) & (1UL << n);

n如果 x 将被设置是 1 , 如果 x 则清除是 0 .如果 x有一些其他的值(value),你会得到垃圾。 x = !!x会将其 bool 化为 0 或 1。

要使其独立于 2 的补码否定行为(其中 -1 设置了所有位,与 1 的补码或符号/幅度 C++ 实现不同),请使用无符号否定。

number ^= (-(unsigned long)x ^ number) & (1UL << n);

unsigned long newbit = !!x;    // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);

使用无符号类型进行可移植位操作通常是个好主意。

number = (number & ~(1UL << n)) | (x << n);

(number & ~(1UL << n))将清除 n th 位和 (x << n)将设置 nx 位.

通常不要复制/粘贴代码也是一个好主意,因此很多人使用预处理器宏(如 the community wiki answer further down )或某种封装。

关于c++ - 如何设置、清除和切换单个位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com