如何在c#中通过|=运算符将负数转换为正数

本文关键字:运算符 转换 | 更新日期: 2023-09-27 18:11:40

我们都知道Int32的最高位定义了它的符号。1表示它是负的,0表示它是正的(可能相反)。我能通过改变一个负数的最高位把它变成正数吗?

我试着用下面的代码来做:

i |= Int32.MaxValue;

如何在c#中通过|=运算符将负数转换为正数

为什么不直接使用Math.Abs(yourInt)方法呢?我认为这里没有必要使用按位操作

如果你只是在寻找一种按位的方式来做到这一点(比如面试问题等),你需要把数字(按位)消掉,然后加1:

int x = -13;
int positiveX = ~x + 1;

这将翻转符号,如果它是正数或负数。作为一个小警告,如果x是int,这将不起作用。MinValue,因为负范围比正范围大1。

当然,在现实世界的代码中,我只使用Math.Abs(),正如已经提到的…

最高有效位定义了它的符号,true。但这还不是全部:

要将正数转换为负数,必须:

  1. 将数字取反(例如,+1,二进制中为0000 0001,变为1111 1110)
  2. 添加1 (1111 1110变为1111 1111,为-1)

这个过程被称为Two的互补。

颠倒这个过程同样简单:

  1. 减1(例如-1,1111 1111变成1111 1110)
  2. 取反(1111 1110变为0000 0001,再次为+1)

可以看到,使用二进制或-操作符无法实现此操作。您需要按位使用 -notadd/ subtract

上面的例子使用8位整数,但是对于所有整数的处理过程完全相同。浮点数只使用一个符号位。

如果你在谈论使用按位操作,它不会像那样工作。我假设你认为你会翻转最高位(标志旗)来获得负数,但它不会像你期望的那样工作。

数字6在32位有符号整数中表示为00000000 00000000 00000000 00000110。如果您将最高位(符号位)翻转为1,您将得到10000000 00000000 00000000 00000110,其十进制值为-2147483642。我想这和你想的不太一样。这是因为负数存储在"负逻辑"中,这意味着11111111 11111111 11111111 11111111为-1。

如果你把x的每一个位都翻转为正值,你得到-(x+1)。例如:

00000000 00000000 00000000 00000110 = 6
11111111 11111111 11111111 11111001 = -7

您仍然需要使用加法(或减法)来产生正确的结果。

我刚刚解决了这个问题:

Int a = IntToSolve; //Whatever int you want
b = a < 0 ? a*-1 : a*1 ;

这样做只会输出正整数。另一种方式是:

Int a = IntToSolve; //Same but from positive to negative
b = a < 0 ? a*1 : a*-1 ;

如果你想从-ve到+ve,或者-1*i如果你想去两个方向,Math.Abs(i)有什么问题?

使用|=运算符是不可能的。它不能取消位。因为符号位是设置在负数上的,所以你不能取消它

遗憾的是,你的追求是徒劳的。按位或运算符能够任意翻转一个位。您可以设置位,但是如果该位已经设置,OR将无法清除它。

绝对不能,因为负号是原负号的补码。因此,即使在负数中MSB为1,也不足以在该位上加1来得到负数。您必须否定所有的位并添加一个

你可以尝试一个更简单的方法changeTime = changeTime>= 0 ?change: -(changeTime);