"$ ((~ 33))" -৪ উত্পাদন করে কেন?


12
$ echo $(( 255 ))
255
$ echo $(( 33 ))
33
$ echo $(( ~33 ))
-34
$ echo $(( ~255 ))
-256
$ 

এবং আমার কার্নেলটি হ'ল:

$ uname -a
Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux

প্রশ্ন: ~ AFAIK নম্বর অবহেলা করার জন্য। তবে কেন ~33উত্পাদন করে -34এবং কেন ~255উত্পাদন করে -256?


2
Bitwise অস্বীকৃতি সঙ্গে গাণিতিক অস্বীকৃতি (বিভ্রান্ত করা যাবে না -x )
chepner

উত্তর:


21

ব্যাশের ম্যান পেজটি বলেছেন:

   ! ~    logical and bitwise negation

স্বাক্ষরযুক্ত সংখ্যাগুলি সাধারণত দুটি এর পরিপূরক উপস্থাপনায় সংরক্ষণ করা হয় :

...
-4 = 1100
-3 = 1101
-2 = 1110
-1 = 1111
 0 = 0000
 1 = 0001
 2 = 0010
 3 = 0011
...

এর অর্থ আপনি যদি 2 এর মতো একটি সংখ্যা নেন তবে এটি 0010 হিসাবে বিটওয়াইজ করা হয়েছে bit বিটওয়াইজ অবহেলার পরে এটি 1101 হয়ে যায়, যা -3 এর প্রতিনিধিত্ব।


10

এটি দুজনের পরিপূরক গাণিতিকের ফলাফল।

~একটি বিটওয়্যার অবহেলা যা চালিত সমস্ত বিটকে উল্টে দেয়। দু'টির পরিপূরক পাটিগণিত সমস্ত বিট উল্টিয়ে 1 যোগ করে কাজ করে Since যেহেতু আপনি কেবল বিটগুলি উল্টিয়েছেন, তবে একটিটি যোগ করেন নি, আপনি একই সংখ্যাটি পাবেন, বিপরীত, বিয়োগফল একটি।

এখানে দু'জনের পরিপূরক সম্পর্কে উইকিপিডিয়ায় একটি ভাল নিবন্ধ রয়েছে ।

উদাহরণ হিসাবে:

  • বাইনারি 3 হয় 0011
  • -3 ইন (দুইটির পরিপূরক) বাইনারি হয় 1101
  • ইনভার্টিং 0011আপনাকে দেয় 1100যা -4, যেহেতু আপনি 1 যোগ করেন নি।

3

~ অপারেটর হ'ল বিটওয়াইটি নট অপারেটর। এটি ব্যবহার করা কোনও সংখ্যাকে অবহেলা করার মতো নয়।

উইকিপিডিয়া থেকে , সামান্য দিকের নয় অপারেশনটি মান বিয়োগের দুটিটির পরিপূরক গ্রহণের সমান:

নয় x = --x - 1

বাইনারি সংখ্যার নেতিবাচকতা তার দ্বি-পরিপূরক মান গ্রহণের সমতুল্য।

Operator NOT অপারেটর ব্যবহার করে = এর এক-পরিপূরক মানটি নিন।

সহজ কথায়, the বাইনারি উপস্থাপনার সমস্ত বিটগুলি কেবল ফ্লিপ করে

আপনার উদাহরণের জন্য:

33 (দশমিক) = 0x00100001 (8-বিট বাইনারি)

~ 33 = ~ 0x00100001 = 0x11011110 = -34 (দশমিক)

বা দশমিক গাণিতিতে, ~ x = -x - 1 সূত্র ব্যবহার করে:

~ 33 = -33 - 1 = -34

এবং

5 255 = -255 - 1 = -256


1

সমস্যাটি হ'ল ~ একটি বিট-বুদ্ধিমান অপারেটর। সুতরাং আপনি সম্ভবত যতটা ইচ্ছা তার চেয়ে বেশি বিট উপেক্ষা করছেন। ফলাফলগুলিকে হেক্স উদাহরণে রূপান্তর করে আপনি এটি আরও ভাল দেখতে পারেন:

result_in_hex=$(printf "%x" $(( ~33 ))); echo $result_in_hex
ffffffffffffffde

বনাম আপনার যা ছিল:

result_in_dec=$(printf "%d" $(( ~33 ))); echo $result_in_dec
-34

আমি ধরে নিচ্ছি আপনি 0x33 এড়াতে চাইছেন। যদি এটি হয় তবে এটি কাজ করবে:

result_in_hex=$(printf "%2x" $(( ( ~ 0x33 ) & 0xFF))); echo $result_in_hex
cc

শুরুতে সমস্ত এফএফ এড়াতে আপনার ব্যবহার করতে হবে এবং এটি বিট-ওয়াইজ এবং অপারেটর।


1

~(গাণিতিক) অপারেটর সমস্ত বিট ফ্লিপ , এটা bitwise অস্বীকৃতি অপারেটর বলা হয়:

! ~    logical and bitwise negation

সুতরাং, যে জায়গাগুলিতে প্রসংগটি গাণিতিক হয়, সেখানে এটি সমস্ত বিটগুলির সাথে একটি সংখ্যাকে শূন্য হিসাবে সমস্ত বিটকে এক হিসাবে পরিবর্তন করে। একটি $(( ~0 ))সংখ্যার উপস্থাপনের সমস্ত বিট (সাধারণত আজকাল b৪ বিট) সকলকে রূপান্তর করে।

$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff

সমস্ত সংখ্যার সাথে একটি সংখ্যা .ণাত্মক সংখ্যা (প্রথম বিট 1) 1বা সহজভাবে ব্যাখ্যা করা হয় -1

$ printf '%x\n' "-1"
ffffffffffffffff

$ echo "$(( ~0 ))"
-1

অন্যান্য সমস্ত সংখ্যার ক্ষেত্রেও একই ঘটনা ঘটে, উদাহরণস্বরূপ: $(( ~1 ))সমস্ত বিটগুলি ফ্লিপ করে:

$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe

বা, বাইনারি: 1111111111111111111111111111111111111111111111111111111111111110

যা দু'জনের উপস্থাপনের সংখ্যা হিসাবে ব্যাখ্যা করা হয়:

$ echo "$(( ~1 ))"
-2

সাধারণভাবে, মানুষের গণিতের সমীকরণটি এটির $(( ~n ))সমান$(( -n-1 ))

$ n=0    ; echo "$(( ~n )) $(( -n-1 ))"
-1 -1

$ n=1    ; echo "$(( ~n )) $(( -n-1 ))"
-2 -2

$ n=255  ; echo "$(( ~n )) $(( -n-1 ))"
-256 -256

এবং (আপনার প্রশ্ন):

$ n=33   ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34

0

প্রথমে আপনাকে বুঝতে হবে যে 33 টি 32 বিট বা 64 বিটের নম্বর।

সংমিশ্রনের জন্য আমি একটি আট বিট নম্বর নিই (= 1 বাইট)

দশমিক 33 আটটি বিটে: 00100001, বিটগুলির ফলাফল 11011110 এ উল্টানো।

হাই অর্ডার বিটটি 1 হওয়ায় এটি একটি নেতিবাচক সংখ্যা।

একটি নেতিবাচক সংখ্যা মুদ্রণ করে, সিস্টেমটি একটি বিয়োগ চিহ্ন প্রিন্ট করে এবং তারপরে negativeণাত্মক সংখ্যায় দু'জনের পরিপূরক করে।

দুটির পরিপূরক হ'ল: বিটগুলি উল্টানো এবং 1 যুক্ত করা।

11011110 ==> 00100001 ==> 1 ==> 00100010 যোগ করলে বিয়োগ চিহ্নের পিছনে দশমিক 34 ফলাফল হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.