我收到一个数字 N,其中 N 是一个 4 位整数,我需要将其 LSB 更改为 1,而无需使用 C 更改数字中的其他 3 位。
基本上,都必须读XXX1。
所以可以说n = 2
,二进制文件是0010
. 我会将 LSB 更改为 1 以生成数字0011
。
我正在努力寻找可以做到这一点的操作组合。我正在与:!
, ~
, &
, |
, ^
, <<
, >>
, +
, -
, =
.
这真的让我发疯了,我一直在玩>>
/<<
并~
从0xF
.
我收到一个数字 N,其中 N 是一个 4 位整数,我需要将其 LSB 更改为 1,而无需使用 C 更改数字中的其他 3 位。
基本上,都必须读XXX1。
所以可以说n = 2
,二进制文件是0010
. 我会将 LSB 更改为 1 以生成数字0011
。
我正在努力寻找可以做到这一点的操作组合。我正在与:!
, ~
, &
, |
, ^
, <<
, >>
, +
, -
, =
.
这真的让我发疯了,我一直在玩>>
/<<
并~
从0xF
.
尝试
number |= 1;
无论数字是多少,这都应将 LSB 设置为 1。为什么?因为按位 OR ( |
) 运算符完全符合其名称的含义:它对两个数字的位进行逻辑或运算。因此,如果您有 1010b 和 1b(十进制的 10 和 1),那么运算符会执行以下操作:
1 0 1 0
OR 0 0 0 1
= 1 0 1 1
这正是你想要的。
为了您的信息,
number |= 1;
声明等价于
number = number | 1;
用于x = x | 0x01;
将 LSB 设置为1
可视化
? ? ? ? ? ? ? ?
OR
0 0 0 0 0 0 0 1
----------------------
? ? ? ? ? ? ? 1
因此,除了 LSB 设置为 1 外,其他位将保持不变。
使用按位或运算符|
。它逐位查看两个数字,并返回通过对每个位执行 OR 生成的数字。
int n = 2;
n = n | 1;
printf("%d\n", n); // prints the number 3
在二进制中,2 = 0010、3 = 0011 和 1 = 0001
0010
OR 0001
-------
0011
如果n
不是0
n | !!n
作品。
如果n
是0
,那么!n
就是你想要的。
更新
花哨的一个班轮:P
n = n ? n | !!n : !n;