কেন ~ সত্য ফলাফল -২ হয়?


132

পাইথন কনসোলে:

~True

আমাকে দেয়:

-2

কেন? কেউ আমাকে বাইনারি এই বিশেষ কেস ব্যাখ্যা করতে পারেন?


22
কারণ ~1হল -2: চেষ্টা করুনTrue == 1
Grijesh চৌহান

15
ঠিক বলতে গেলে: " True is 1" এটি সত্য নয়, তবে এটি সত্য True == 1
বাচ

3
আপনি কি সত্যিই ভাবেন UNARY_INVERT(পুরো বাইটোকডটি দেখে) উত্তরের সাথে কিছু যুক্ত করবে?
উবুল

2
এখানেই প্রশ্ন উঠেছে না সদৃশ! এটি একটি নির্দিষ্ট আচরণ সম্পর্কে জিজ্ঞাসা করে bool। এটি কীভাবে ~কাজ করে তা নয় । আসলে এই প্রশ্নের একটি বৈধ উত্তর 2 এর পরিপূরক এবং কীভাবে ~আদৌ পূর্ণসংখ্যার উপর পরিচালিত হয় তা উল্লেখ করা এড়াতে পারে ।
বাকুরিউ

উত্তর:


240

int(True)হয় 1

1 হল:

00000001

এবং ~1হ'ল:

11111110

কোনটি -2মধ্যে দুই এর সম্পূরক 1

1 সমস্ত বিট ফ্লিপ করুন, ফলাফলের সংখ্যায় 1 যুক্ত করুন এবং এর परिमाण টির বাইনারি উপস্থাপনা হিসাবে ফলাফলটি ব্যাখ্যা করুন এবং একটি নেতিবাচক চিহ্ন যুক্ত করুন (যেহেতু সংখ্যাটি 1 দিয়ে শুরু হয়):

11111110  00000001  00000010 
                    
       Flip       Add 1

যা 2, তবে এমএসবি 1 হওয়ায় সাইনটি নেতিবাচক ।


উল্লেখযোগ্য:

মনে সম্পর্কে bool, আপনি যে প্রকৃতিতে সাংখ্যিক খোঁজার হবে - এটা দুই মান আছে, Trueএবং False, এবং তারা ঠিক ইন্টিজার 1 এবং 0 যেটি শুধুমাত্র নিজেদের ভিন্নভাবে মুদ্রণ সংস্করণ "কাস্টমাইজড" হয়। এগুলি পূর্ণসংখ্যার ধরণের সাবক্লাসint

সুতরাং তারা ঠিক 1 এবং 0 হিসাবে আচরণ করে, ব্যতীত boolপুনরায় সংজ্ঞা দেওয়া strএবং reprতাদের আলাদাভাবে প্রদর্শন করা।

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True

>>> True == 1
True
>>> True is 1  # they're still different objects
False

1
@ofcapl শুধু বলতে চেয়েছিলেন: যদিও int('1')এটি 1কিন্তু ~'1'একটি টাইপরর ব্যতিক্রম হতে পারে যদিও ~Trueএটি নয় কারণ @ মার্তিজানের boolএকটি সাবক্লাস intতার উত্তরে এই তথ্য যুক্ত করেছে।
গ্রিজেশ চৌহান

@Ofcapl রেকর্ডের জন্য, এই উত্তরটি কী চলছে তার বাইনারি গাণিতিক ব্যাখ্যা দেখায়, আসল বাইটকোড নয় (যা উত্স থেকে সংকলিত মধ্যবর্তী বা অপারেশন স্তরের কোডের এক ধরণের হবে)।
প্যাট্রিক এম

5
আপনি কি ভাষা সম্পর্কে কথা বলছেন? আমি ঠিক 0 কোথায় জানি True == -1, এবং আমি অনেকগুলিই জানি যেখানে কেউ এটি বলতে পারে True == 1...
l4mpi

1
@etrusco @ l4mpi কিছু পুরানো স্কুল বেসিক সত্যের -1জন্য ব্যবহার করে ; যতক্ষণ আপনি শর্ট সার্কিটের বিষয়ে চিন্তা করেন না ততক্ষণ বিটওয়াইড এবং ও ওআর অপারেটরগুলি যৌক্তিক ওআরএন্ড ও ও এর জন্যও কাজ করে ( x & -1এটি একই ক্ষেত্রে x && 1শূন্য নয়), । তবে যতদূর আমি জানি, মূলধারার কোনও ভাষা -1সত্যের জন্য ব্যবহার করে নি ।
কুক্সপ্লসোন

1
আনুষ্ঠানিক truthহিসাবে যুক্তি সংজ্ঞা দেয়; সব নয় trueহচ্ছে false। যে সমস্ত প্রোগ্রামিং ভাষা সম্পর্কে আমি সচেতন সেগুলি আনুষ্ঠানিক false(0) এবং এটি মিথ্যা সত্তা নয়) হিসাবে সংজ্ঞায়িত করে তার মাথায় আনুষ্ঠানিক যুক্তি ঘুরিয়ে দেয় true। উদাহরণস্বরূপ সি # , যদিও জাভাস্ক্রিপ্ট হ'ল এক বহিরাগত, এমন একাধিক সত্যের স্বাদ এবং মিথ্যাচারের একাধিক স্বাদ রয়েছে
নিকোলাস কেরি

45

পাইথন boolটাইপটি একটি সাবক্লাস int(historicalতিহাসিক কারণে; বুলিয়ানগুলি কেবল পাইথন ২.৩ এ যুক্ত হয়েছিল)।

যেহেতু int(True)হয় 1, ~Trueহয় ~1হয় -2

একটি সাবক্লাস কেন জন্য পিইপি 285 দেখুন ।boolint

যদি আপনি বুলিয়ান বিপরীত চান, ব্যবহার করুন not:

>>> not True
False
>>> not False
True

আপনাকে জানতে হবে কেন চেয়েছিলেন ~1হয় -2, এটা কারণ আপনার একটি স্বাক্ষরিত পূর্ণসংখ্যা সমস্ত বিট ইনভার্টারিং হয়; একটি স্বাক্ষরিত পূর্ণসংখ্যার একটি নেতিবাচক সংখ্যা যা 00000001হয়ে যায় , দেখুন দুটি এর পরিপূরক :1111110

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

যেখানে প্রাথমিক 1বিটের অর্থ মানটি নেতিবাচক এবং বাকি বিটগুলি ইতিবাচক সংখ্যা বিয়োগের একের বিপরীতটি এনকোড করে।


1
@GrijeshChauhan: দুই এর প্রশংসা জন্য, আপনি ব্যবহার করতে পারে struct.pack, যেমন bin(integer)বা format(integer, '08b')অ্যাকাউন্টে সাইন ইন পূর্ণসংখ্যার নিতে না।
মার্টিজন পিটারস

@thefourtheye, MartijnPieters আমি চেষ্টা করেছিলেন কিন্তু এটা বিভ্রান্তিকর যেমন bin(~True), bin(-2), bin(~1)সব দেয় '-0b10' তাহলে -2উপস্থাপনা 10তাহলে কেন -সাইন ইন করুন।
গ্রিজেশ চৌহান

আমি 10নিজেকে 2'কমপ্লিট-এর অর্থ কী ?
গ্রিজেশ চৌহান

1
@ গ্রিজেশচৌহান আপনি এই জাতীয় দুটি নেতিবাচক এবং ধনাত্মক সংখ্যার পরিপূরক স্বীকৃতি পেতে পারেনformat(-2 % (1 << 32), "032b")
thefourtheye

2
@ থেফোর্তে: আমি একটি বিটমাস্ক ব্যবহার করেছি:format(-2 & ((1 << 32) - 1), "032b")
মার্টিজান পিটার

4

~True == -2হয় বিস্ময়কর না যদি True উপায়ে 1 এবং ~ মানে , bitwise বিপর্যয় ...

... যে প্রদান

  • True একটি পূর্ণসংখ্যা হিসাবে বিবেচনা করা যেতে পারে এবং
  • পূর্ণসংখ্যা দুটি এর পরিপূরক হিসাবে প্রতিনিধিত্ব করা হয়

সম্পাদনা:

  • পূর্ণসংখ্যার উপস্থাপনা এবং বিটওয়াইস ইনভার্সন অপারেটরের মধ্যে মিশ্রণ স্থির করে
  • আরেকটি পলিশিং প্রয়োগ করেছেন (বার্তাটি সংক্ষিপ্ততর হবে, আরও বেশি কাজের প্রয়োজন হবে)

2
~"2 এস পরিপূরক" এর অর্থ এই নয়। ~"বিটওয়াইজ ইনভার্সন" এর অর্থ
ম্যাককে

1
"ওনস 'পরিপূরক" বাক্যাংশটি আসলে কোনও ক্রিয়াকলাপকে বোঝায় না, যতটা এটি বিটগুলিতে পূর্ণসংখ্যা সংরক্ষণের সিস্টেমকে বোঝায়। এমন একটি সিস্টেম যা আসলে কোনও কম্পিউটার সিস্টেমে ব্যবহৃত হয় না।
ম্যাককে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.