คุณสามารถแปลงจำนวนลบเป็นค่าบวกดังนี้:
int myInt = System.Math.Abs(-5);
มีวิธีการเทียบเท่าที่จะทำให้จำนวนบวกเป็นลบหรือไม่?
คุณสามารถแปลงจำนวนลบเป็นค่าบวกดังนี้:
int myInt = System.Math.Abs(-5);
มีวิธีการเทียบเท่าที่จะทำให้จำนวนบวกเป็นลบหรือไม่?
คำตอบ:
เกี่ยวกับ
myInt = myInt * -1
myInt = - Myintไงล่ะ
myInt *= - 1?
myShort = (short) -myShortcast จำเป็นเพราะ short จะกลายเป็น int เมื่อถูกทำให้ไร้ผล
int myNegInt = System.Math.Abs(myNumber) * (-1);
int negInt = -System.Math.Abs(myInt)
myInt<0 ? myInt : -myInt;ดีกว่ามาก เนื่องจากตัวดำเนินการ - ถูกจัดเตรียมไว้เป็นชวเลขสำหรับ -1 * หมายเลขที่ถูกต้องบวกกับความสามารถในการโอเวอร์โหลดไม่ทำให้ * (-1) เคล็ดลับ
เช่นเดียวกับที่คุณทำสิ่งอื่นใดในแง่ลบ: ใส่เครื่องหมายลบไว้ข้างหน้า
var positive = 6;
var negative = -positive;
int myNegInt = System.Math.Abs(myNumber) * (-1);
หมายเหตุถึงทุกคนที่ตอบกลับด้วย
- Math.Abs(myInteger)
หรือ
0 - Math.Abs(myInteger)
หรือ
Math.Abs(myInteger) * -1
เป็นวิธีที่จะทำให้จำนวนลบเป็นลบและเปลี่ยนเป็นลบ
วิธีนี้มีข้อบกพร่องเดียว มันไม่ทำงานสำหรับจำนวนเต็มทั้งหมด ช่วงของInt32ประเภทคือตั้งแต่ "-2 31 " ถึง "2 31 - 1" หมายความว่ามีหมายเลข "ลบ" อีกหนึ่งหมายเลข ดังนั้นพ่นMath.Abs(int.MinValue)OverflowException
วิธีที่ถูกต้องคือการใช้ข้อความสั่งแบบมีเงื่อนไข:
int neg = n < 0 ? n : -n;
วิธีนี้ใช้ได้กับจำนวนเต็ม "ทั้งหมด"
Abs) ที่ไม่สามารถใช้งานได้int.MinValue(สมมติว่าเป็นintชนิดส่งคืน) ในกรณีนี้คุณตกลงที่จะยกเว้นอย่างสมบูรณ์ อย่างไรก็ตามปัญหาเฉพาะนี้มีผลลัพธ์ "ถูกต้อง" int.MinValueแต่มีข้อยกเว้นหากคุณใช้Absเส้นทาง
nเป็นเช่น-32768นั้นก็-nคือ-32768!!! นอกจากนี้int neg = n < 0 ? n : -n;อาจไม่สามารถทำงานได้ในทุกกรณีเนื่องจากหนึ่งในไตรภาคไม่ได้ทำสิ่งใดเลย
วิธีง่าย ๆ :
myInt *= -1;
int negInt = 0 - myInt;
หรือรับประกันว่าจะติดลบ
int negInt = -System.Math.Abs(someInt);
ในการเปลี่ยนเครื่องหมายของจำนวนเต็มคุณเพียงแค่ใช้เครื่องหมายผู้ดำเนินการ:
myInt = -myInt;
ในการทำให้เป็นลบโดยไม่คำนึงว่าค่าเดิมเป็นลบหรือไม่คุณต้องใช้วิธีการ Abs ก่อน:
myInt = -Math.Abs(myInt);
เพื่อความสนุกสนานยิ่งขึ้น:
int myInt = Math.Min(hisInt, -hisInt);
int myInt = -(int)Math.Sqrt(Math.Pow(Math.Sin(1), 2) + Math.Pow(Math.Cos(-1), 2))
* Math.Abs(hisInt);
แก้ไข: นี่เป็นสิ่งที่ผิดสำหรับอินพุตที่เป็นบวก ... ฉันทำผิดพลาดจากการลืมว่าบิตที่เหลือใน -x (2s-Complement value) เป็น 'ตรงกันข้าม' ของค่าของพวกเขาใน + x ไม่เหมือนกัน ดังนั้นการเปลี่ยนเครื่องหมายบิตจะไม่สามารถใช้กับจำนวนบวกได้
ฉันจะออกจากที่นี่เพื่อวัตถุประสงค์ ...
หรือวิธีที่ยุ่งยาก (ฉันคิดว่า) ...
int y = x | ~ int.MaxValue;
cause int.MaxValue is 0111 1111 1111 1111 1111 1111 1111 1111
ดังนั้น
~int.MaxValue is 1000 0000 0000 0000 0000 0000 0000 0000
และดังนั้น int32 Or'ed ใด ๆ ที่จะใส่ 1 ในบิตเครื่องหมาย (ทำให้เป็นลบ) และปล่อยบิตอื่น ๆ ทั้งหมดให้เหมือนกัน ...
แก้ไข: จริงแล้วตั้งแต่ 1,000 0000 0000 0000 0000 0000 0000 0000 เป็นจริงค่าต่ำสุดสิ่งนี้ควรทำงานเช่นกัน:
int y = x | int.MinValue; // or, to do it to itself,
x |= int.MinValue;
-numberแต่สำหรับตัวเลขบวกเพียงพลิกบิตเครื่องหมายไม่ได้ทำให้ 1เป็นศูนย์ทั้งหมดและหนึ่ง หรือไอเอ็นจีด้วยint.MinValueจะส่งผล 10000000000000000000000000000001 ซึ่งไม่เท่ากับ-1(ทุกคน.)
แม้ว่าฉันจะไปงานเลี้ยงสายที่นี่ฉันจะพูดสอดกับกลเม็ดที่มีประโยชน์จากฮาร์ดแวร์ของฉัน ทั้งหมดเหล่านี้ถือว่าการเป็นตัวแทนของ 2 ชมเชยสำหรับหมายเลขที่ลงนาม
int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));
i == int.MinValueดังนั้นตัวแปรทั้งหมดคือ-2147483648
ฉันใช้ myInt = -myInt;
ง่ายและสะดวก
หากคุณต้องการมี แต่แง่บวก
myInt = myInt>0 ? myInt : -myInt;
int.MaxValueเป็น2147483647แม้จะvar i = int.MaxValue; i++;ไม่ทำงาน
แค่เล่น ๆ:
int negativeInt = int.Parse(String.Format("{0}{1}",
"-", positiveInt.ToString()));
อัปเดต : ความสวยงามของวิธีการนี้คือคุณสามารถปรับโครงสร้างให้เป็นตัวสร้างข้อยกเว้นได้อย่างง่ายดาย:
int negativeInt = int.Parse(String.Format("{0}{1}",
"thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);
ไม่มีใครบอกว่ามันจะต้องมีการใด ๆโดยเฉพาะอย่างยิ่งจำนวนลบ
บางทีนี่อาจ?
int n;
.... some coding....
n = n<=0? n:0-n;
int myInt = - System.Math.Abs(-5);
คูณด้วย -1
การแปลงตัวเลขจากบวกเป็นลบหรือลบเป็นบวก:
public static decimal Reverse(this decimal source)
{
return source * decimal.MinusOne;
}
สิ่งที่ฉันต้องการแบ่งปัน
public decimal NumberReevaluate(decimal number, bool isPositive)
{
var tempNumber = System.Math.Abs(number);
return isPositive ? tempNumber : -tempNumber;
}
number >= 0 == isPositive ? number : -number
ดังที่ได้กล่าวไปแล้วการคูณด้วย -1 จะไม่เจ๋งเหมือน int.MinValue * -1 == int.MinValue
มันขึ้นอยู่กับแอปพลิเคชันของคุณ แต่สำหรับฉัน (แกนจอยสติ๊ก Inverting) ฉันต้องการให้แน่ใจว่าทุก ๆ
ด้วยเหตุนี้ฉันแม็พ Max <--> Min และทุกอย่างที่อยู่ระหว่างรับ a * -1
การใช้เทคนิคนี้ -32767 ไม่สามารถเข้าถึงได้เมื่อ inverting
private static int Invert(int value)
{
if (value == int.MaxValue) return int.MinValue;
if (value == int.MinValue) return int.MaxValue;
return value * -1;
}
5ไม่ได้แต่-5 1/5
ใช้ไบนารีและเพื่อลบบิตสุดท้ายที่รับผิดชอบในการลบเครื่องหมาย
หรือใช้เลขฐานสองหรือเพื่อเพิ่มเครื่องหมายให้กับประเภทข้อมูล
Soln นี้อาจฟังดูไร้สาระและไม่สมบูรณ์ แต่ฉันรับประกันได้ว่านี่เป็นวิธีที่เร็วที่สุด
หากคุณไม่ทดลองกับสิ่งที่ฉันโพสต์โพสต์นี้อาจดูอึ: D
เช่นสำหรับ int:
Int คือประเภทข้อมูล 32 บิตดังนั้นบิตสุดท้าย (อันที่ 32) กำหนดเครื่องหมาย
และด้วยค่าที่มี 0 ใน 32 ตำแหน่งและส่วนที่เหลือ 1 มันจะแปลงค่าลบเป็น + ve
สำหรับสิ่งที่ตรงกันข้ามหรือมีค่า 1 ใน 32 และพัก 0
X=*-1อาจไม่สามารถทำงานได้กับคอมไพเลอร์ทั้งหมด ... เนื่องจากมันอ่าน 'ทวีคูณ' 'SUBTRACT' 1 แทนการเป็นลบลบ alt ที่ดีกว่าคือX=(0-X)[ซึ่งแตกต่างจากX-=X]