如何仅使用布尔运算符来知道二进制数是否为负数?

时间:2018-01-24 17:14:58

标签: c arduino

我必须使用布尔运算符(如下所示)编写代码,以便为返回true或false的方法编写代码(如果数字为负数或正数):

Bitwise AND (c = a & b), c has 1s in the places where both of the 
corresponding bits in a and b are 1.
Bitwise OR (c = a | b), c has 1s wherever at least one of the 
corresponding bits in a and b is 1.
Bitwise XOR (c = a ^ b), c has 1s wherever one and only one of the 
corresponding bits in a and b is 1.
Bitwise NOT (c = ~a), c is a with each bit inverted.
Right shift (c = a >> b), c is a, with each bit moved lower b places.
Left shift (c = a << b), c is a, with each bit moved higher b places.
Boolean AND (c = a && b), c is 1 if both a and b are non-zero.
Boolean OR (c = a || b), c is 1 if either a and b are non-zero.
Boolean NOT (c = !a), c is 1 only if a is 0.

我必须完成这个:

int isNegativeInt(int num) {
  // something goes here
  return num;
}

如果为真,它应该返回1,这意味着num是负数 如果为false则返回0,表示num是正数

我必须为以下内容做同样的事情:

int isNegativeLong(long num) {
  // something goes here
  return num;
}

int isNegativeChar(char num) {
   // something goes here
  return num;
}

有什么想法吗?什么都有帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

鉴于赋值,我认为我们只是想测试高位,或许假设int是二进制补码。我还假设我们无法使用INT_MIN或类似信息(例如sizeof int)来了解int的符号位。

如果我们被允许使用unsigned,那么我们可以使用unsigned H = -1u ^ -1u >> 1;确定高位。 (这是有效的,因为-1u是一个unsigned值,所有位都置位,-1u >> 1除了高位设置之外都有,而异或它们只留下高位集。)

之后,num & H当且仅当num中的高位置位时才为非零。所以我们可以返回!!(num & H)

如果我们不能使用unsigned(也许分配是编写适用于任何有符号整数类型的代码,而不仅仅是int),那么我希望仅使用列出的运算符进行赋值。要看到这个:

  • 所有按位运算符(&|^~)独立地并行运行每个位,因此它们可以不能以任何方式区分高位,因此不能用来挑出高位。

  • 逻辑运算符(&&||)和!对浓缩为单个位的所有位进行操作。同样,他们不会以任何方式区分高位,因此不能用来挑出高位。

  • 因此,我们留下<<>>。这些确实区分了高位和低位,因为它们是用于移位或移出位的边界。但是,如果一个数字为负数,则将其向左移位是未定义的,并且将其向右移位是实现定义的。因此,我们不能编写严格符合C的代码来转移我们不知道的值是否为负值。

  • 我们可以使用按位运算符清除各个位以产生一个我们可以安全移位的数字,但是,由于那些不能区分高位,我们无法知道它们何时清除了高位以使数字安全换班。我们通常不知道什么时候清除了高位(例如,我们不能写代码清除所有位而是高位,因为如果我们不知道高位在哪里,我们不知道第二高的位置。

因此,从列出的操作中,我们无法对负数执行测试其高位。