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


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.