如何通过| = C#中的运算符将负数转换为正数?

时间:2011-10-18 15:35:10

标签: c#

我们都知道Int32的最高位定义了它的符号。 1表示它是否定的,0表示它是正面的(可能是逆转的)。我可以通过更改其最高位来将负数转换为正数吗?

我尝试使用以下代码执行此操作:

i |= Int32.MaxValue;

但它不起作用。

10 个答案:

答案 0 :(得分:34)

为什么不使用Math.Abs(yourInt)方法?我没有看到在这里使用按位操作的必要性。

答案 1 :(得分:21)

如果您只是寻找一种按位方式来执行此操作(如面试问题等),则需要取消数字(按位)并添加1:

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

如果是正面或负面,这将翻转标志。作为一个小警告,如果x是int.MinValue,这将不起作用,因为负范围比正范围多一个。

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

答案 2 :(得分:2)

最重要的位定义了它的标志,是的。但这不是一切:

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

  1. 取消数字(例如,+1,二进制为0000 0001,变为1111 1110
  2. 添加1(1111 1110转为1111 1111,即-1)
  3. 该过程称为Two's complement

    反转过程同样简单:

    1. Substract 1(例如,-1,1111 1111变为1111 1110
    2. 取消数字(1111 1110变为0000 0001,再次为+1)。
    3. 如您所见,使用二进制文件或 -operator无法实现此操作。你需要按位 - 不添加 / 减法

      以上示例使用8位整数,但该过程对所有整数的工作方式完全相同。 浮点数但只使用符号位。

答案 3 :(得分:1)

我刚刚解决了这个问题:

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 ;

答案 4 :(得分:0)

Math.Abs(i)如果你想从-ve到+ ve,或者-1*i,如果你想双向去,那么是错误的吗?

答案 5 :(得分:0)

使用|=运算符是不可能的。它不能取消位。由于符号位设置为负数,因此无法取消设置。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

你绝对不能,因为负面是原始的the two's complements。因此,即使在负数中,MSB为1也不应该使用1来获得负数。 您必须否定所有位并添加一个

答案 8 :(得分:0)

如果您正在谈论使用按位操作,它将无法正常工作。我假设你认为你会翻转最高位(符号标志)以获得负数,但它不会像你期望的那样工作。

数字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

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

答案 9 :(得分:0)

changeTime = changeTime >= 0 ? changeTime : -(changeTime);