如何在c#中通过|=运算符将负数转换为正数
本文关键字:运算符 转换 | 更新日期: 2023-09-27 18:11:40
我们都知道Int32的最高位定义了它的符号。1
表示它是负的,0
表示它是正的(可能相反)。我能通过改变一个负数的最高位把它变成正数吗?
我试着用下面的代码来做:
i |= Int32.MaxValue;
为什么不直接使用Math.Abs(yourInt)
方法呢?我认为这里没有必要使用按位操作
如果你只是在寻找一种按位的方式来做到这一点(比如面试问题等),你需要把数字(按位)消掉,然后加1:
int x = -13;
int positiveX = ~x + 1;
这将翻转符号,如果它是正数或负数。作为一个小警告,如果x是int,这将不起作用。MinValue,因为负范围比正范围大1。
当然,在现实世界的代码中,我只使用Math.Abs()
,正如已经提到的…
最高有效位定义了它的符号,true。但这还不是全部:
要将正数转换为负数,必须:
- 将数字取反(例如,+1,二进制中为
0000 0001
,变为1111 1110
) - 添加1 (
1111 1110
变为1111 1111
,为-1)
这个过程被称为Two的互补。
颠倒这个过程同样简单:
- 减1(例如-1,
1111 1111
变成1111 1110
) - 取反(
1111 1110
变为0000 0001
,再次为+1)
可以看到,使用二进制或-操作符无法实现此操作。您需要按位使用 -not和add/ 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);