0

我收到一个数字 N,其中 N 是一个 4 位整数,我需要将其 LSB 更改为 1,而无需使用 C 更改数字中的其他 3 位。

基本上,都必须读XXX1。

所以可以说n = 2,二进制文件是0010. 我会将 LSB 更改为 1 以生成数字0011

我正在努力寻找可以做到这一点的操作组合。我正在与:!, ~, &, |, ^, <<, >>, +, -, =.

这真的让我发疯了,我一直在玩>>/<<~0xF.

4

4 回答 4

2

尝试

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;
于 2012-09-08T04:19:17.857 回答
0

用于x = x | 0x01;将 LSB 设置为1

可视化

      ?  ?  ?  ?  ?  ?  ?  ?
   OR
      0  0  0  0  0  0  0  1
      ----------------------
      ?  ?  ?  ?  ?  ?  ?  1

因此,除了 LSB 设置为 1 外,其他位将保持不变。

于 2012-09-08T04:19:25.893 回答
0

使用按位或运算符|。它逐位查看两个数字,并返回通过对每个位执行 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 
于 2012-09-08T04:20:31.250 回答
0

如果n不是0

n | !!n

作品。

如果n0,那么!n就是你想要的。


更新

花哨的一个班轮:P

n = n ? n | !!n : !n;
于 2012-09-08T04:21:06.010 回答