仅使用 C 中的按位运算符检查数字 x 是否为正 (x>0)

发布于 2024-09-26 18:02:03 字数 433 浏览 3 评论 0原文

isPositive - 如果 x > 则返回 true 0,否则false

示例:isPositive(-1)

合法操作:! ~ & ^ | + << >>< /code>

最大操作数:8

注意:不允许使用条件语句。

inline bool isPositive(int32_t x) {
  return ???;
}

isPositive - return true if x > 0, otherwise false

Example: isPositive(-1)

Legal ops: ! ~ & ^ | + << >>

Max ops: 8

Note: No conditional statements are allowed.

inline bool isPositive(int32_t x) {
  return ???;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

流年里的时光 2024-10-03 18:02:03
int isPositive(int x) {
   return !((x&(1<<31)) | !x);
}

x&(1<<31 是检查数字是否为负数。

!x 是检查数字是否为零。

如果数字不为负数,则为正数并且不为零。

int isPositive(int x) {
   return !((x&(1<<31)) | !x);
}

x&(1<<31 is to check if the number is negative.

!x is to check if the number is zero.

A number is positive if it's not negative and not zero.

倒数 2024-10-03 18:02:03
return !((x & 0x80000000) >> 31 | !x);
return !((x & 0x80000000) >> 31 | !x);
静谧 2024-10-03 18:02:03
int isPositive(int x)
{
 return (!(x & 0x80000000) & !!x); 
}
int isPositive(int x)
{
 return (!(x & 0x80000000) & !!x); 
}
凝望流年 2024-10-03 18:02:03

让我们来玩一下符号位: sign(~n) : 1 if n >= 0

要摆脱 n 为 0 时的情况: sign( ~n + 1):如果 n > 则为 1 0 或 n = MIN_INT

因此,我们希望两个函数都返回 1 的情况:

return ((~n & (~n + 1)) >> 31) & 1;

Let's play with the sign bit: sign(~n) : 1 if n >= 0

To get rid of the case when n is 0: sign(~n + 1) : 1 if n > 0 or n = MIN_INT

So, we want the case when both functions return 1:

return ((~n & (~n + 1)) >> 31) & 1;
三五鸿雁 2024-10-03 18:02:03

为什么不使用XOR (^)

试试这个,

{
    return ((x>>31)&1)^(!!x); 
}

可以很好的处理0的情况。

Why not use XOR (^)?

Try this,

{
    return ((x>>31)&1)^(!!x); 
}

It can deal with the 0 case well.

雪落纷纷 2024-10-03 18:02:03

假设采用二进制补码表示(并非总是如此!),这可以通过测试是否设置了最高有效位(在这种情况下数字为负)来实现。

请注意,以下代码使用非法操作(+*-),但这些只是为了清晰起见和平台独立性。如果您更了解您的特定平台,例如 int 是一个 32 位数字,则相关常量可以替换为它们的数值。

// Will be 1 iff x < 0.
int is_neg = (x & (INT_MAX + 1)) >> (CHAR_BIT * sizeof(int) - 1);
// Will be 1 iff x != 0.
int is_not_zero = !!x;
return !is_neg & is_not_zero;

Assuming a two’s complement representation (not always the case!), this can be achieved by testing whether the most significant bit is set (in which case the number is negative).

Notice that the following code uses illegal operations (+, * and -) but these are for clarity and platform independence only. If you know more about your particular platform, e.g. that int is a 32 bit number, the relevant constants can be replaced by their numeric value.

// Will be 1 iff x < 0.
int is_neg = (x & (INT_MAX + 1)) >> (CHAR_BIT * sizeof(int) - 1);
// Will be 1 iff x != 0.
int is_not_zero = !!x;
return !is_neg & is_not_zero;
趁微风不噪 2024-10-03 18:02:03

已经有一段时间没有做过汇编了,但据我记得单词中的第一个数字代表负值,例如 1000 是 -8,因此如果最高有效位是 1,则数字是负数。所以答案是!(x>>31)

Haven't done assembler for quite a while, but as far as I remember first digit in the word represents negative value e.g. 1000 is -8, hence if most significant bit is 1 the number is negative. So the answer is !(x>>31)

又爬满兰若 2024-10-03 18:02:03

如果您使用使用 MSB 作为标牌位的数字系统,您可以执行以下操作:

int IsPositive(int x)
{
    return (((x >> 31) & 1) ^ 1) ^ !x;
}

if your working with a number system that uses the MSB as the signage bit, you can do:

int IsPositive(int x)
{
    return (((x >> 31) & 1) ^ 1) ^ !x;
}
毅然前行 2024-10-03 18:02:03

您在这里还有另一个选择:

int is_positive = (0&x^((0^x)&-(0<x)));

它只是一个 (0 & min(0,x))。

此处测试

You have another option here:

int is_positive = (0&x^((0^x)&-(0<x)));

It is just a (0 & min(0,x)).

Test here

惯饮孤独 2024-10-03 18:02:03

int isPositive(int x)

{

 return ( ! (x & ( 1 << 31 ) ) );

}

如果给定 no is +ve 则返回 1,如果给定 no is -ve 则返回 0

在这个函数中我们得到符号位,如果是 1 则意味着 no is -ve 所以我们返回 0
如果符号位为 0,则表示数字为 +ve,因此我们返回 1 。

int isPositive(int x)

{

 return ( ! (x & ( 1 << 31 ) ) );

}

It will return 1 if given no is +ve and return 0 if given no is -ve

in this function we got sign bit if that is 1 it means no is -ve so we return 0
and if sign bit is 0 it means number is +ve so we return 1 .

过气美图社 2024-10-03 18:02:03
int x,len;
x = 0x0fffffff;
len = (sizeof(x) * 8) - 2;

if ((x>>len))
 printf("Negative\n");
else
 printf("Positive\n");

X 将为 int 或 char(整数类型)。

int x,len;
x = 0x0fffffff;
len = (sizeof(x) * 8) - 2;

if ((x>>len))
 printf("Negative\n");
else
 printf("Positive\n");

X will be either int or char(Integral type).

暮凉 2024-10-03 18:02:03

返回 !((x>>31)&1);
这是为了检查MSB。

return !((x >> 31) & 1);
This is to check MSB.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文