C语言中如何使用逆函数

发布于 2024-11-17 07:58:13 字数 453 浏览 2 评论 0原文

[如何使用 ~ 运算符]

我有一个结构说 Alpha。我知道 Alpha 内元素的值(例如 a),可以是 01 - 我想要相同结构的其他元素取 Alpha.a 的倒数。例如:

if Alpha.a = 1
then Alpha.b = 0

反之亦然,

我尝试过:

Alpha.b = ~ (Alpha.a)

但不幸的是它不起作用 - 当 Alpha.a1 时,Alpha.b 设置为254

有什么想法吗?

谢谢和问候,

萨姆普拉特

[how to use ~ operator ]

I have a structure say Alpha. I know the value of element inside Alpha (say a) which can be 0 or 1 - I want the other element of same structure to take inverse value of Alpha.a. For example:

if Alpha.a = 1
then Alpha.b = 0

and vice versa

I have tried:

Alpha.b = ~ (Alpha.a)

But unfortunately it doesnt work - when Alpha.a is 1, Alpha.b gets set to 254

Any ideas?

Thanks and regards,

SamPrat

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

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

发布评论

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

评论(7

墨落成白 2024-11-24 07:58:13

在 C 语言中,true 用 1 表示,false 用 0 表示。但是,在比较中,任何非 false 值都被视为 true。

! 运算符执行布尔值反转,因此 !0 为 1,!1 为 0。

然而,~ 运算符执行按位运算 反转,其中值中的每一位都被其反转替换。所以 ~0 是 0xffffffff (-1)。 ~1 是 0xfffffffe (-2)。 (-1 和 -2 都被认为是 true,这可能会让您感到困惑。)

您想要的是 !,而不是 ~

In C, true is represented by 1, and false by 0. However, in a comparison, any non-false value is treated is true.

The ! operator does boolean inversion, so !0 is 1 and !1 is 0.

The ~ operator, however, does bitwise inversion, where every bit in the value is replaced with its inverse. So ~0 is 0xffffffff (-1). ~1 is 0xfffffffe (-2). (And both -1 and -2 are considered as true, which is probably what's confusing you.)

What you want is !, instead of ~.

清风夜微凉 2024-11-24 07:58:13

使用异或运算符:

Alpha.b = Alpha.a ^ 1;

Use XOR operator:

Alpha.b = Alpha.a ^ 1;
冷了相思 2024-11-24 07:58:13

~ 运算符对每个单独的位取反。例如,假设 Alpha.a 是一个 unsigned char。然后~1将以二进制形式读取为~00000001,结果将是11111110(同样是二进制),这与十进制的254和十六进制的0xFE相同。

正如其他人所建议的,使用 !Alpha.aAlpha.a ^ 1

The ~ operator negates each individual bit. For example, assume that Alpha.a is an unsigned char. Then ~1 would read, in binary as, ~00000001, and the result would be 11111110 (again, in binary), which is the same as 254 in decimal and 0xFE in hex.

As others have suggested, use !Alpha.a or Alpha.a ^ 1.

风筝有风,海豚有海 2024-11-24 07:58:13

针对这个常见问题的一个很好的跨平台跨语言解决方案是:

Alpha.b = 1 - Alpha.a;

A nice cross-platform cross language solution to this common problem is:

Alpha.b = 1 - Alpha.a;
勿挽旧人 2024-11-24 07:58:13

操作后位掩码怎么样?

使用无符号字符寻找 bit0:

b = 0x01u & ( ~a );

或什至

b = a ^ 0x01u;

真正的布尔值”,你应该使用 TRUE 和 FALSE(如果已定义)。)

b = (1 != a)?(0u):(1u);

或“Boolean-Thinkers”(请注意 TRUE 和 FALSE 可能与 0/1 不同!如果你想要它“

What about a postoperational bitmask?

using unsigned chars looking for bit0:

b = 0x01u & ( ~a );

or even

b = a ^ 0x01u;

or for "Boolean-Thinkers" ( be aware TRUE and FALSE may differ from 0/1 ! if you want it "real boolean" you should use TRUE and FALSE if defined.)

b = (1 != a)?(0u):(1u);

Cheers

甚是思念 2024-11-24 07:58:13

您不能使用 ~ 因为这会将 00000000 变成 11111111 而不是 00000001 因为我认为您是期待。

如果你有布尔值,你可以使用:

Alpha.b = !(Alpha.a)

但如果没有,你可能必须使用 if / else 逻辑:

if (Alpha.a == 0)
{
    Alpha.b = 1;
}
else
{
    Alpha.b = 0;
}

You can't use ~ as this will turn 00000000 into 11111111 rather than 00000001 as I think you're expecting.

If you have bools you can use:

Alpha.b = !(Alpha.a)

but if not you may have to use if / else logic:

if (Alpha.a == 0)
{
    Alpha.b = 1;
}
else
{
    Alpha.b = 0;
}
无法回应 2024-11-24 07:58:13

您想使用另一个运算符。具体来说 !

Alpha.b = !Alpha.a

由于值为零或一,因此要简单得多。

You want to use another operator. Specifically !

Alpha.b = !Alpha.a

Since the values are zero or one, it is much simplier.

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