我们都知道Int32的最高位定义了它的符号。 1
表示它是否定的,0
表示它是正面的(可能是逆转的)。我可以通过更改其最高位来将负数转换为正数吗?
我尝试使用以下代码执行此操作:
i |= Int32.MaxValue;
但它不起作用。
答案 0 :(得分:34)
为什么不使用Math.Abs(yourInt)
方法?我没有看到在这里使用按位操作的必要性。
答案 1 :(得分:21)
如果您只是寻找一种按位方式来执行此操作(如面试问题等),则需要取消数字(按位)并添加1:
int x = -13;
int positiveX = ~x + 1;
如果是正面或负面,这将翻转标志。作为一个小警告,如果x是int.MinValue,这将不起作用,因为负范围比正范围多一个。
当然,在现实世界的代码中,我只使用Math.Abs()
已经提到过......
答案 2 :(得分:2)
最重要的位定义了它的标志,是的。但这不是一切:
要将正数转换为负数,您必须:
0000 0001
,变为1111 1110
)1111 1110
转为1111 1111
,即-1)该过程称为Two's complement。
反转过程同样简单:
1111 1111
变为1111 1110
)1111 1110
变为0000 0001
,再次为+1)。如您所见,使用二进制文件或 -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);