सी # में नकारात्मक करने के लिए एक सकारात्मक संख्या में कनवर्ट करें


142

आप इस तरह एक ऋणात्मक संख्या को धनात्मक में बदल सकते हैं:

int myInt = System.Math.Abs(-5);

वहाँ एक सकारात्मक संख्या नकारात्मक बनाने के लिए एक समान विधि है?



3
280Z28: यह myInt = -1 के बराबर है।
पुनरावर्ती

1
मींट हो गया है | = int.MinValue;
चार्ल्स ब्रेटाना

@ 280Z28: यह केवल विषम संख्या के लिए काम करता है, अन्यथा यह संख्या ऋणात्मक करने होंगे और फिर 1. घटाकर रूप में एक ही है
सेसिल एक नाम है

3
कोड स्पष्टता के लिए, मुझे नहीं लगता कि आपको System.Math.Abs ​​() का उपयोग करना चाहिए यदि आप "नकारात्मक संख्या को सकारात्मक में बदलना" चाहते हैं। गणितीय रूप से, यह वह नहीं है जो पूर्ण मूल्य है, भले ही आपको वांछित परिणाम प्राप्त हो। आपके एल्गोरिदमिक संदर्भ के आधार पर, आपको नकारात्मक से सकारात्मक में जाने के लिए नीचे दिए गए समाधान का उपयोग करना चाहिए।
क्रिस ड्वायर

जवाबों:


452

कैसा रहेगा

myInt = myInt * -1


55
क्योंकि यह भी सकारात्मक को नकारात्मक में बदल सकते हैं यह समाधान बहुत अच्छा है! प्रतिभाशाली!
विल Eddins

19
मैं इस धारणा के तहत था कि आप इसे नकारने के लिए किसी भी चीज़ के सामने बस "-" चिपका सकते हैं ... -myInt यह myInt में मान का ऋणात्मक होगा ... -ABS (myInt) एक गैर-ऋणात्मक ऋणात्मक होगा।
DataDink

12
किस बारे में myInt = - Myint?
kokbira

9
या इससे भी कम myInt *= - 1?
nawfal

FYI करें यदि आप कोकबिरा की विधि को शॉर्ट के साथ आज़माते हैं, तो myShort = (short) -myShortकास्ट आवश्यक है क्योंकि शॉर्ट को नकारात्मक होने पर इंट बन जाता है।
एरोनॉल्स

236
int myNegInt = System.Math.Abs(myNumber) * (-1);

29
+1 यह याद रखने के लिए कि यदि यह पहले से ही एक नकारात्मक है तो आप पर इसका विपरीत प्रभाव पड़ेगा। आपका उत्तर एकमात्र ऐसा है जो हमेशा इस बात की परवाह किए बिना एक नकारात्मक संख्या देगा कि क्या MyNumber सकारात्मक या नकारात्मक है।
डेविड

इस जवाब के लिए केवल 26 वोट? क्या ऐसे SO उपयोगकर्ता हैं जो सोचते हैं कि यह काम नहीं करेगा?
MusiGenesis

6
30 वोट? पहले से ही सवाल इतना सरल है। और यह अति-जटिल उत्तर (-System.Math.Abs ​​(myNumber) भी करेगा) को 30 वोट मिलते हैं ????
mmmmmmmm

4
@rstevens सभी को इस उत्तर को इंगित करने के लिए सहयोग करने की कोशिश कर रहा है, जो स्वीकृत उत्तर की तुलना में कहीं अधिक सही है। इसके अलावा, - बनाम * -1 निश्चित रूप से नहीं है "अति-जटिल"।
रेक्स एम

4
मुझे यह जवाब -System.Math से बेहतर लगता है। एक के बाद से, यह एक नज़र में थोड़ा और अधिक स्पष्ट है कि क्या हो रहा है ... मुझे लगता है कि बयान के सामने "-" को याद करना थोड़ा आसान होगा।
बेस्का

132
int negInt = -System.Math.Abs(myInt)

11
हाँ, क्योंकि निषेध लक्ष्य है, तो एक एकल शून्य से सही ऑपरेटर है। दूसरी ओर, नकारात्मक को गुणा करना एक मूल्य को नकारने के लिए सिर्फ एक चाल है।
स्टीवन सुदित

38
यह एक ट्रिक है क्योंकि यह एक साइड-इफ़ेक्ट पर निर्भर करता है, न कि प्राइमरी इफ़ेक्ट पर। एकात्मक ऋण का प्राथमिक प्रभाव नकारात्मक है। गुणन का प्राथमिक प्रभाव गुणा करना है। यह सिर्फ इतना होता है कि -1 से गुणा करना। क्या यह स्पष्ट है?
स्टीवन Sudit

5
@StevenSudit नहीं, * -1 से अच्छा नहीं। -1 से गुणा करना "एक चाल" नहीं है, यह संख्या को नकारात्मक मोड़ने का गणितीय तरीका है। -नंबर सिर्फ 1 * नंबर का शॉर्टहैंड है। इसके अलावा, संख्या को नकारात्मक रखने के लिए Abs का उपयोग करना एक ओवरकिल है। myInt<0 ? myInt : -myInt;ज़्यादा बेहतर है। सिर्फ इसलिए कि - ऑपरेटर को उचित -1 * नंबर प्लस ओवरलोडिंग क्षमताओं के लिए शॉर्टहैंड के रूप में प्रदान किया जाता है, यह * (-1) एक चाल नहीं बनाता है।
थंडरग्रास 30'14

93

जिस तरह से आप किसी और चीज को नकारात्मक बनाते हैं: उसके सामने एक नकारात्मक संकेत डालें।

var positive = 6;
var negative = -positive;

8
हर कोई एक नाबालिग को भूल जाता है।
पुनरावर्ती

इस और इस उत्तर के बीच व्यावहारिक अंतर को int myNegInt = System.Math.Abs(myNumber) * (-1);
समझें

@ makerofthings7, जो आप से जुड़ा है वह बहुत अधिक सीपीयू निर्देश है - एक निरपेक्ष-मूल्य ऑपरेशन ( x86 पर कम से कम तीन निर्देश ), इसके बाद एक एमयूएल (या संभवतः एक एनईजी यदि कंपाइलर चतुर है)। यह उत्तर एक एकल, हल्का एनईजी ओपोड है, जो आपको आवश्यकता से अधिक या कम नहीं है। बेशक, दो जवाब अलग ढंग से व्यवहार जब इनपुट नंबर पहले से ही नकारात्मक है, अगर (इस सवाल के विपरीत) आपका इनपुट नकारात्मक हो सकता है, जो आपके लिए निर्णय लेता है।
जो व्हाइट

41

उन सभी के लिए ध्यान दें, जिन्होंने जवाब दिया

- 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 के MinValue को नहीं लेने पर निर्भर करता है, भंगुर है।
स्टीवन सुदित

स्टीवन: कभी-कभी, आप एक ऐसी समस्या (जैसे Abs) हल कर रहे हैं जो संभवतः काम नहीं कर सकती है int.MinValue( intरिटर्न प्रकार मानकर ।) उस मामले में, अपवाद को फेंकना पूरी तरह से ठीक है। हालाँकि, इस विशिष्ट समस्या के लिए "मान्य" परिणाम है, int.MinValueलेकिन यदि आप Absमार्ग लेते हैं तो एक अपवाद को फेंक देता है ।
मेहरदाद अफश्री

यह कहने के बाद कि नकारात्मक पैमाने सकारात्मक से बड़ा है, आप तब जाकर उस कोड का सुझाव दें जो इसके लिए जिम्मेदार नहीं है। अगर nहै -32768तो -nALSO -32768!!! इसके अलावा int neg = n < 0 ? n : -n;संभवतः सभी मामलों में काम नहीं कर सकता है, क्योंकि टर्नरीज़ में से एक बिल्कुल कुछ भी नहीं करता है।
क्लाइव गॉलवे


16
int negInt = 0 - myInt;

या नकारात्मक होने की गारंटी।

int negInt = -System.Math.Abs(someInt);

11

एक पूर्णांक के हस्ताक्षर के लिए, आपको सिर्फ हस्ताक्षर ऑपरेटर का उपयोग करें:

myInt = -myInt;

मूल मान ऋणात्मक है या नहीं, इसे नकारात्मक बनाने के लिए, आप पहले ABS विधि का उपयोग करें:

myInt = -Math.Abs(myInt);

6

बस अधिक मज़ा के लिए:

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);

2
बहुत जोखिम भरा, IMHO। क्या होगा अगर एक सर्कल की परिभाषा बदल जाए?
मुसइनेसिस

6

संपादित करें: यह सकारात्मक इनपुट के लिए गलत है ... मैंने यह भूलने की गलती की कि शेष बिट्स -x (2s-Complement value) + x में उनके मूल्य के 'विपरीत' हैं, समान नहीं। तो केवल साइन बिट को बदलने से सकारात्मक संख्याओं के लिए काम नहीं होगा।

मैं इस उद्देश्य के लिए यहाँ छोड़ दूँगा ...

या मुश्किल तरीका (मुझे लगता है) ...

पूर्णांक 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 डाल देगा, (इसे नकारात्मक बना देगा), और अन्य सभी बिट्स को समान छोड़ दें ...

संपादित करें: वास्तव में, चूंकि 1000 0000 0000 0000 0000 0000 0000 0000 वास्तव में Minvalue है, इसलिए यह काम करना चाहिए:

   int y = x | int.MinValue; // or, to do it to itself,
   x |= int.MinValue;

तो, नकारात्मक शून्य int.MinValue के बराबर है?
पुनरावर्ती

नहीं, दोहों के पूरक में, कोई नकारात्मक शून्य नहीं है। सभी नकारात्मक हैं। एक हस्ताक्षरित 8Bit Int: 10000000 -128 है
चार्ल्स Bretana

1
+1 कोई नहीं की तरह एक सवाल का जवाब देने के लिए downvoted किया जाना चाहिए, क्योंकि "क्या पत्र एक के बाद लेकिन सी से पहले आता है?"
MusiGenesis

... और नीचे @ मेहराड के जवाब के लिए धन्यवाद, यह एकमात्र तरीका है जो इनपुट int.inValue होने पर काम करता है ...
चार्ल्स

चार्ल्स: यह गलत है। नकारात्मक संख्याओं के लिए, यह काम करता है लेकिन सकारात्मक संख्याओं के लिए, बस साइन बिट को फ़्लिप करने से कुछ नहीं होता है -number1सभी शून्य और एक है। इसके साथ-साथ इसका int.MinValueपरिणाम 10000000000000000000000000000001 पर होगा, जो -1(सभी वाले) के बराबर नहीं है।
मेहरदाद आफश्री

6

भले ही मैं यहाँ पार्टी के लिए देर से जा रहा हूँ, मैं अपने हार्डवेयर दिनों से कुछ उपयोगी चाल के साथ झंकार करने जा रहा हूँ। ये सभी हस्ताक्षरित संख्याओं के लिए 2 की प्रशंसा प्रतिनिधित्व मानते हैं।

int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));

यह अधिक समझाने के लिए देखभाल? के साथ i == int.MinValue, तब सभी चर हैं-2147483648
क्लाइव गॉलवे

5

सिर्फ मनोरंजन के लिए:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "-", positiveInt.ToString()));

अद्यतन : इस दृष्टिकोण की सुंदरता यह है कि आप इसे आसानी से एक अपवाद जनरेटर में बदल सकते हैं:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));

5

मैं उपयोग करता हूं myInt = -myInt;

इतना सरल और आसान

यदि आप केवल सकारात्मक होना चाहते हैं

myInt = myInt>0 ? myInt : -myInt;

मैं ओपी के रूप में कुछ अलग स्थिति में इस जवाब की तलाश कर रहा था। मैं चाहता हूं कि 2 मानों में से प्रत्येक को नकारा जाए, यदि उनमें से एक -5 है, तो दूसरा 5 होना चाहिए, इसके लिए मेरा सबसे अच्छा समाधान है = डी
मैथ्यू ब्रूवर्स

आप के बाद से एक अतिप्रवाह मिलेगा int.MaxValueहै 2147483647, यहां तक कि var i = int.MaxValue; i++;अभ्यस्त काम
सीएमएस

4
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);

किसी ने भी यह नहीं कहा कि इसे कोई विशेष ऋणात्मक संख्या होना चाहिए ।


उम, अगर आपको परवाह नहीं है कि यह एक विशेष ऋणात्मक संख्या है, तो आप इसे "लंबे ऋणात्मक = = -1" को सरल बना सकते हैं;
बेस्का

@ गफ्फा: यह वास्तव में यहाँ मजाक है।
मुसीगेंनेस




0

किसी संख्या को धनात्मक से ऋणात्मक या ऋणात्मक से धनात्मक में परिवर्तित करना:

public static decimal Reverse(this decimal source)
{
     return source * decimal.MinusOne;
}

0

बस कुछ ऐसा है जिसे मैं साझा करना चाहता हूं।

public decimal NumberReevaluate(decimal number, bool isPositive)
{
    var tempNumber = System.Math.Abs(number);
    return isPositive ? tempNumber : -tempNumber;
}

1
number >= 0 == isPositive ? number : -number
विटालि

0

जैसा कि पहले उल्लेख किया गया है, बस -1 से गुणा करना अच्छा नहीं है, जैसा कि int.MinValue * -1 == int.MinValue

यह वास्तव में आपके आवेदन पर निर्भर करता है, लेकिन मेरा (इन्वर्टिंग जॉयस्टिक कुल्हाड़ियों के लिए) मैं यह सुनिश्चित करना चाहता हूं कि सभी चरम अभी भी उपलब्ध हैं, और जितना संभव हो उतना निष्ठा बनाए रखें।
यह अंत करने के लिए, मैं मैक्स को मैप करता हूं <-> न्यूनतम और सब कुछ के बीच में * -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
डेफी

-2

बाइनरी का उपयोग करें और अंतिम बिट को हटाने के लिए जो नकारात्मक संकेत के लिए जिम्मेदार है।

या बाइनरी का उपयोग करें या डेटाटाइप में संकेत जोड़ने के लिए।

यह सॉल्यूशन बेतुका और अधूरा लग सकता है लेकिन मैं गारंटी दे सकता हूं कि यह सबसे तेज तरीका है।

यदि आपने इस पोस्ट के साथ प्रयोग नहीं किया है तो यह पोस्ट बकवास लग सकती है: D

उदाहरण के लिए:

Int 32 बिट डेटाटाइप है इसलिए अंतिम बिट (32 वां एक) संकेत निर्धारित करता है।

और एक मान के साथ जिसमें 32 स्थान में 0 है और बाकी 1. यह ऋणात्मक संख्या + में नहीं बदलेगा।

32 वें स्थान पर 1 और बाकी 0 के साथ सिर्फ विपरीत या एक मूल्य के लिए।


-3

X=*-1सभी कंपाइलरों पर काम नहीं हो सकता है ... क्योंकि यह NEGATIVE के बजाय एक 'गुणा' 'SUBTRACT' 1 को पढ़ता है X=(0-X), बेहतर ऊंचाई है , [जो कि अलग है X-=X]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.