উত্তর:
মনে রাখবেন যে negativeণাত্মক সংখ্যাগুলি ধনাত্মক অংশের দুটির পরিপূরক হিসাবে সঞ্চয় করা হয় । উদাহরণ হিসাবে, এখানে দুটি পরিপূরক -2 এর উপস্থাপনা: (8 বিট)
1111 1110
আপনি যেভাবে পাচ্ছেন তা হ'ল কোনও সংখ্যার বাইনারি উপস্থাপনা নেওয়া, এর পরিপূরক নেওয়া (সমস্ত বিট উল্টানো) এবং একটি যোগ করা। দুটি 0000 0010 হিসাবে শুরু হয় এবং বিটগুলি উল্টিয়ে আমরা 1111 1101 পাই one একটি যোগ করে আমাদের উপরের ফলাফলটি পেয়ে যায়। প্রথম বিটটি হ'ল সাইন বিট, একটি নেতিবাচক বোঝায়।
সুতরাং আসুন আমরা কীভাবে ~ 2 = -3 পাই তা একবার দেখে নিই:
এখানে আবার দুটি:
0000 0010
কেবলমাত্র সমস্ত বিটগুলি ফ্লিপ করুন এবং আমরা পাই:
1111 1101
আচ্ছা, দু'জনের পরিপূরকটিতে -3 দেখতে কেমন? ধনাত্মক 3: 0000 0011 দিয়ে শুরু করুন, সমস্ত বিটগুলি 1111 1100 এ ফ্লিপ করুন এবং একটিকে নেতিবাচক মান (-3), 1111 1101 হয়ে উঠুন।
সুতরাং আপনি যদি 2-এ বিটগুলি সহজভাবে উল্টান, আপনি দুটি-এর পরিপূরক প্রতিনিধিত্ব পাবেন -3।
~
মান বিট উল্টানো।
সংখ্যাগুলি কীভাবে সামান্য দিকের উপস্থাপন করা ~2
হয় -3
তা কেন করা হয় । সংখ্যা দুটি এর পরিপূরক হিসাবে প্রতিনিধিত্ব করা হয় ।
সুতরাং, 2 বাইনারি মান হয়
00000010
এবং ~ 2 বিটগুলি ফ্লিপ করে তাই মানটি এখন:
11111101
কোনটি -3 এর বাইনারি উপস্থাপনা।
অন্যরা যেমন উল্লিখিত ~
বিটগুলি উল্লেখ করেছেন (এক থেকে শূন্য এবং এক থেকে শূন্য পরিবর্তন) এবং যেহেতু দু'জনের পরিপূরক ব্যবহৃত হয় আপনি ফল পেয়েছেন।
একটি জিনিস যুক্ত করার জন্য হ'ল দু'জনের পরিপূরকটি কেন ব্যবহৃত হয়, এটি এমন যে নেতিবাচক সংখ্যার ক্রিয়াকলাপগুলি ইতিবাচক সংখ্যার মতো হবে the চিন্তা করুন -3
নম্বর যার হিসেবে 3
অনুক্রমে যুক্ত করা উচিত শূন্য পেতে এবং আপনি দেখতে পাবেন এই নম্বরে যে 1101
, মনে রাখবেন যে বাইনারি উপরন্তু শুধু প্রাথমিক স্কুল (দশমিক) -এর মত উপরন্তু কেবলমাত্র আপনি এক বহন যখন আপনি দুই বদলে 10 পাবেন ।
1101 +
0011 // 3
=
10000
=
0000 // lose carry bit because integers have a constant number of bits.
অতএব 1101
হয় -3
, বিট আপনি পেতে টুসকি 0010
যা দুটি।
আমি জানি এই প্রশ্নের উত্তর অনেক আগে পোস্ট করা হয়েছে তবে আমি আমার উত্তরটি তার জন্য ভাগ করে নিতে চেয়েছিলাম।
সংখ্যার পরিপূরক সন্ধানের জন্য প্রথমে এর বাইনারি সমতুল্য সন্ধান করুন। এখানে, দশমিক সংখ্যা বাইনারি ফর্ম 2
হিসাবে প্রতিনিধিত্ব করা 0000 0010
হয়। এখন এর পরিপূরকটি উল্টিয়ে (1 এর সমস্ত 1 টি 0 এর মধ্যে এবং সমস্ত 0 এর 1 এর মধ্যে 1) এর বাইনারি উপস্থাপনার সমস্ত সংখ্যার, যার ফলস্বরূপ হবে:
0000 0010 → 1111 1101
এটি দশমিক সংখ্যা 2 এর মধ্যে একটির পরিপূরক And এবং প্রথম বিট, অর্থাত্, বাইনারি সংখ্যায় সাইন বিটটি 1, এর অর্থ এটি সাইনটি সঞ্চিত সংখ্যার জন্য নেতিবাচক । (এখানে, সংখ্যা উল্লেখ করা হয় না 2 কিন্তু 2 একজনের পরিপূরক)।
এখন, যেহেতু সংখ্যাগুলি 2 এর পরিপূরক হিসাবে গণ্য করা হয় (যার সাথে একটি সংখ্যার অতিরিক্ত একের পরিপূরক গ্রহণ করা হয়), তাই এই বাইনারি সংখ্যাটি 1111 1101
দশমিক হিসাবে প্রদর্শন করতে প্রথমে আমাদের এর 2 এর পরিপূরকটি খুঁজে বের করতে হবে যা হবে:
1111 1101 → 0000 0010 + 1 → 0000 0011
এটি 2 এর পরিপূরক। বাইনারি সংখ্যার দশমিক প্রতিনিধিত্ব 0000 0011
, হ'ল 3
। এবং, যেহেতু উপরে উল্লিখিত হিসাবে সাইন বিটটি ছিল তাই ফলস্বরূপ উত্তরটি -3
।
ইঙ্গিত: আপনি যদি এই পদ্ধতিটি মনোযোগ সহকারে পড়েন তবে আপনি দেখতে পেয়েছেন যে কারও পরিপূরক অপারেটরের ফলাফলটি আসলে সংখ্যার (অপারেন্ড - যার উপর এই অপারেটরটি প্রয়োগ করা হয়) এবং একটি নেতিবাচক চিহ্ন সহ একটি। আপনি অন্যান্য সংখ্যা দিয়েও এটি চেষ্টা করে দেখতে পারেন।
add, flip, add
। 0010
-> 0011
-> 1100
->1101
0010
1101
0010
NOT 0 = 1
এবং NOT 1 = 0
। চার বিট সিস্টেমে NOT 0011
(3) = 1100
(12 স্বাক্ষরিত, -4 স্বাক্ষরিত)। আমি যা বুঝি তার থেকে দুটির পরিপূরককে সংজ্ঞায়িত করা হয় (NOT n) + 1
এবং বিটের সংখ্যা নির্বিশেষে কোনও সংখ্যার নেতিবাচক সমকক্ষকে খুঁজে পেতে ব্যবহৃত হয়। এইভাবে 2c(5) = -5
,। দেখুন, এখন এটি সঠিক ধারণা তৈরি করে makes যতক্ষণ আপনি এই অপারেশনটিকে এটি বলে ঠিক ততক্ষণ: কিছুটা উলটে নয়।
int a = 4; System.out.println (~ ক); ফলাফল হবে: -5
জাভাতে কোনও পূর্ণসংখ্যার '~' 1 এর সম্পূর্ণরূপে 2 এর পরিসংখ্যান উপস্থাপন করে। উদাহরণস্বরূপ, আমি ~ 4 নিচ্ছি, যার অর্থ বাইনারি উপস্থাপনা 0100. প্রথমত, একটি পূর্ণসংখ্যার দৈর্ঘ্য চার বাইট হয়, অর্থাৎ 4 * 8 (1 বাইটের জন্য 8 বিট) = 32। সুতরাং সিস্টেমের মেমোরিতে 4 টি 0000 0000 0000 0000 0000 0000 0000 0000 0100 হিসাবে প্রতিনিধিত্ব করা হয়েছে now অপারেটর উপরের বাইনারি নম্বরে 1 এর পরিপূরক সম্পাদন করবে
উদাহরণস্বরূপ 1111 1111 1111 1111 1111 1111 1111 1011-> 1 এর পরিপূরকটি সবচেয়ে উল্লেখযোগ্য বিট সংখ্যার (অথবা - অথবা +) যদি এটি 1 হয় তবে চিহ্নটি '-' যদি 0 হয় তবে চিহ্নটি '+' অনুযায়ী রয়েছে এটি আমাদের ফলাফলটি একটি নেতিবাচক সংখ্যা, জাভাতে নেতিবাচক সংখ্যাগুলি 2 এর পরিপূরক আকারে সংরক্ষণ করা হয়, অর্জিত ফলাফলটি আমাদের 2 এর পরিপূরকতে রূপান্তর করতে হবে (প্রথমে 1 এর পরিপূরক সম্পাদন করুন এবং কেবল 1 থেকে 1 এর পরিপূরক যোগ করুন)। সমস্ত উল্লেখযোগ্য বিট 1 ব্যতীত সমস্তই শূন্য হয়ে উঠবে (যা আমাদের সংখ্যার লক্ষণ প্রতিনিধিত্ব, যার অর্থ বাকি 31 বিট 1111 1111 1111 1111 1111 1111 1111 1011 (~ অপারেটরের প্রাপ্ত ফলাফল) 1000 0000 0000 0000 0000 0000 0000 0100 (1 এর পরিপূরক)
1000 0000 0000 0000 0000 0000 0000 0000 0101 এখন ফলাফল -5 ভিডিওটির জন্য এই লিঙ্কটি চেক আউট << [জাভাতে বিট বুদ্ধিমান অপারেটর] https://youtu.be/w4pJ4cGWe9Y
কেবল ...........
2 এর যে কোনও সংখ্যার পরিপূরক হিসাবে আমরা 1 টি যোগ করার চেয়ে সমস্ত 1 গুলি 0 এর বিপরীত করে উল্টো করে গণনা করতে পারি ..
এখানে N = ~ N ফলাফল উত্পন্ন করে - (N + 1) সর্বদা। কারণ 2 এর পরিপূরক আকারে সিস্টেম স্টোরের ডেটা যার অর্থ এটি ~ N এর মতো সঞ্চয় করে।
~N = -(~(~N)+1) =-(N+1).
উদাহরণ স্বরূপ::
N = 10 = 1010
Than ~N = 0101
so ~(~N) = 1010
so ~(~N) +1 = 1011
এখন বিন্দুটি মাইনাস আসে সেখান থেকে। আমার মতামত মনে করুন আমাদের কাছে 32 বিট রেজিস্টার রয়েছে যার অর্থ 2 ^ 31 -1 বিট অপারেশনের সাথে জড়িত রয়েছে এবং একটি বিটকে বিশ্রাম দেওয়ার জন্য যা পূর্ববর্তী গণনে পরিবর্তন হয় (পরিপূরক) সাইন বিট হিসাবে সংরক্ষণ করা হয় যা সাধারণত 1 হয়। এবং আমরা 10 ডলার হিসাবে -11 হিসাবে ফলাফল পেতে।
~ (-11) = 10;
উপরেরটি সত্য হলে প্রিন্টফ ("% d", ~ 0); আমরা ফলাফল পেতে: -1;
তবে ফলাফলের চেয়ে মুদ্রণ ("% u",, 0): 32 বিট মেশিনে 4294967295।
বিটওয়াইস পরিপূরক অপারেটর (~) একটি অ্যানারি অপারেটর।
এটি নিম্নলিখিত পদ্ধতি অনুসারে কাজ করে
প্রথমে প্রদত্ত দশমিক সংখ্যাটিকে তার সম্পর্কিত বাইনারি মানকে রূপান্তর করে 2 এটি 2 এর ক্ষেত্রে এটি প্রথমে 2 থেকে 0000 0010 (8 বিট বাইনারি সংখ্যায়) রূপান্তর করে।
তারপরে এটি সংখ্যার সমস্ত 1 টি 0 তে এবং সমস্ত শূন্যকে 1 তে রূপান্তর করে; তখন সংখ্যাটি 1111 1101 হয়ে যাবে।
এটি -3 এর 2 এর পরিপূরক প্রতিনিধিত্ব।
পরিপূরক ব্যবহার করে স্বাক্ষরবিহীন মানটি সন্ধান করার জন্য, 1111 1101কে দশমিক (= 4294967293) রূপান্তর করতে আমরা কেবল মুদ্রণের সময়% u ব্যবহার করতে পারি।
আমি মনে করি বেশিরভাগ মানুষের জন্য বিভ্রান্তির অংশটি দশমিক সংখ্যা এবং স্বাক্ষরিত বাইনারি সংখ্যার মধ্যে পার্থক্য থেকে আসে, তাই প্রথমে এটি পরিষ্কার করে দেওয়া যাক:
মানব দশমিক বিশ্বের জন্য: 01 এর অর্থ 1, -01 অর্থ -1, কম্পিউটারের বাইনারি জগতের জন্য: 101 এর অর্থ 5 যদি এটি স্বাক্ষরবিহীন থাকে। 101 এর অর্থ (-4 + 1) যদি স্বাক্ষরিত হয় তবে সাইনড ডিজিটের অবস্থান x এ রয়েছে। | এক্স
সুতরাং 2 এর বিছানা বিট = ~ 2 = ~ (010) = 101 = -4 + 1 = -3 বিভ্রান্তিটি স্বাক্ষরিত ফলাফল (101 = -3) এবং আনইংযুক্ত ফলাফল (101 = 5) মেশানো থেকে আসে comes
tl; dr ~
বিটগুলি ফ্লিপ করে। ফলস্বরূপ সাইন পরিবর্তন হয়। ~2
aণাত্মক সংখ্যা ( 0b..101
)। আউটপুট একটি ঋণাত্মক সংখ্যা ruby
প্রিন্ট -
, তারপর দুই এর সম্পূরক ~2
: -(~~2 + 1) == -(2 + 1) == 3
। ধনাত্মক সংখ্যাগুলি যেমন হয় আউটপুট।
একটি অভ্যন্তরীণ মান এবং এর স্ট্রিং প্রতিনিধিত্ব আছে। ইতিবাচক পূর্ণসংখ্যার জন্য, তারা মূলত:
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
পরেরটির সমতুল্য:
irb(main):003:0> 2.to_s
"2"
~
অভ্যন্তরীণ মান বিট ফ্লিপ। 2
হয় 0b010
। ~2
হয় 0b..101
। দুটি বিন্দু ( ..
) একটি অসীম সংখ্যার 1
গুলি উপস্থাপন করে। যেহেতু ফলাফলটির সর্বাধিক উল্লেখযোগ্য বিট (এমএসবি) 1
, ফলাফলটি negativeণাত্মক সংখ্যা ( (~2).negative? == true
)। ruby
A ণাত্মক সংখ্যা প্রিন্ট আউটপুট করতে -
, তারপরে দুটি অভ্যন্তরীণ মানের পরিপূরক। দুইটির পরিপূরক বিটগুলি উল্টিয়ে, তারপরে যুক্ত করে গণনা করা হয় 1
। দুটির পরিপূরক 0b..101
হ'ল 3
। যেমন:
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
সংক্ষিপ্তসার হিসাবে, এটি বিটগুলি ফ্লিপ করে, যা সাইন পরিবর্তন করে। একটি নেতিবাচক সংখ্যা আউটপুট করতে এটি প্রিন্ট করে -
, তারপরে ~~2 + 1
( ~~2 == 2
)।
কারণ ruby
আউটপুট ঋণাত্মক সংখ্যা তাই মত, কারণ এটি পরম মান একটি দুই এর সম্পূরক হিসেবে সংরক্ষিত মান একইরূপে হয়। অন্য কথায়, যা সঞ্চিত তা 0b..101
। এটি একটি নেতিবাচক সংখ্যা এবং এর মতো এটি কোনও দু'টির কিছু মূল্যের পরিপূরক x
। এটির জন্য এটি x
দুটির পরিপূরক হয় 0b..101
। যা দুটির পরিপূরক দুটি এর পরিপূরক x
। যা x
(যেমন ~(~2 + 1) + 1 == 2
) eg
আপনি যদি ~
নেতিবাচক সংখ্যার জন্য আবেদন করেন তবে এটি কেবল বিটগুলি ফ্লিপ করে (যা সাইন পরিবর্তন করে)
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
আরও বিভ্রান্তিকর বিষয় হ'ল ~0xffffff00 != 0xff
(বা এমএসবি সমান অন্য কোনও মান 1
)। এটা একটু সহজ করে করা যাক: ~0xf0 != 0x0f
। কারণ এটি 0xf0
ইতিবাচক সংখ্যা হিসাবে আচরণ করে । যা আসলে বোঝায়। তাই ~0xf0 == 0x..f0f
,। ফলাফলটি নেতিবাচক সংখ্যা। দুটির পরিপূরক 0x..f0f
হ'ল 0xf1
। তাই:
irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
আপনি যদি ফলাফলটিতে বিটওয়াইড অপারেটরগুলি প্রয়োগ করতে যাচ্ছেন না, আপনি অপারেটর ~
হিসাবে বিবেচনা করতে পারেন -x - 1
:
irb(main):018:0> -2 - 1
=> -3
irb(main):019:0> --3 - 1
=> 2
কিন্তু এটি তাত্ক্ষণিকভাবে খুব বেশি ব্যবহারের নয়।
একটি উদাহরণ হিসাবে ধরা যাক আপনাকে একটি 8-বিট দেওয়া হয়েছে (সরলতার জন্য) নেটমাস্ক, এবং আপনি এর সংখ্যার গণনা করতে চান 0
। আপনি বিটগুলি উল্টিয়ে এবং কল করে bit_length
( 0x0f.bit_length == 4
) কল করে এগুলি গণনা করতে পারেন । তবে ~0xf0 == 0x..f0f
, তাই আমরা অনিবদ্ধ বিটগুলি কেটে ফেলেছি:
irb(main):014:0> '%x' % (~0xf0 & 0xff)
=> "f"
irb(main):015:0> (~0xf0 & 0xff).bit_length
=> 4
অথবা আপনি এক্সওআর অপারেটর ( ^
) ব্যবহার করতে পারেন :
irb(main):016:0> i = 0xf0
irb(main):017:0> '%x' % i ^ ((1 << i.bit_length) - 1)
=> "f"
প্রথমে আমাদের প্রদত্ত অঙ্কটিকে তার বাইনারি অঙ্কগুলিতে বিভক্ত করতে হবে এবং তারপরে শেষ বাইনারি অঙ্কে যুক্ত করে বিপরীত করতে হবে this : 2 এস বাইনারি ফর্মটি 00000010 এ পরিবর্তিত হয় 11111101 এ এটি পরিপূরক, তারপর পরিপূরক 00000010 + 1 = 00000011 যা তিনটির বাইনারি ফর্ম এবং সাইন আই, -3 সহ
বিট-ওয়াইজ অপারেটর একটি অ্যানারি অপারেটর যা আমার অভিজ্ঞতা এবং জ্ঞান অনুসারে সাইন এবং প্রসারিত পদ্ধতিতে কাজ করে।
উদাহরণস্বরূপ ~ 2 এর ফলাফল -3 হবে।
এর কারণ, বিট-ওয়াইজ অপারেটর প্রথমে সাইন এবং প্রস্থে সংখ্যাটি উপস্থাপন করবে যা 0000 0010 (8 বিট অপারেটর) যেখানে এমএসবি সাইন বিট।
তারপরে এটি 2 নেগেটিভ সংখ্যা নেবে যা -2 হয়।
-2 সাইন এবং প্রস্থে 1000 0010 (8 বিট অপারেটর) হিসাবে উপস্থাপিত হয়।
পরে এটি LSB (1000 0010 + 1) এ 1 যুক্ত করে যা আপনাকে 1000 0011 দেয়।
যা -৩।
জাভাস্ক্রিপ্ট টিল্ড (~) তার পরিপূরককে প্রদত্ত মানকে জোর করে দেয় - সমস্ত বিট উল্টানো হয়। এটাই তো টিলডে করে। এটা মতামত স্বাক্ষর নয়। এটি কোনও পরিমাণ যোগ বা বিয়োগ করে না।
0 -> 1
1 -> 0
...in every bit position [0...integer nbr of bits - 1]
জাভাস্ক্রিপ্টের মতো উচ্চ-স্তরের ভাষা ব্যবহার করে স্ট্যান্ডার্ড ডেস্কটপ প্রসেসরগুলিতে, BASE10 স্বাক্ষরিত গাণিতিকগুলি সর্বাধিক সাধারণ, তবে মনে রাখবেন, এটি একমাত্র ধরণের নয়। সিপিইউ স্তরে বিটগুলি বিভিন্ন কারণের ভিত্তিতে ব্যাখ্যার বিষয়। 'কোড' স্তরে, জাভাস্ক্রিপ্টে, এগুলি সংজ্ঞা অনুসারে 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হয় (আসুন এটি থেকে ভাসা ছেড়ে দেওয়া যাক)। এটিকে কোয়ান্টাম হিসাবে ভাবেন, সেই 32-বিটগুলি একসাথে অনেকগুলি সম্ভাব্য মান উপস্থাপন করে। এটি সম্পূর্ণরূপে রূপান্তরকারী লেন্সগুলির উপর নির্ভর করে আপনি সেগুলি দেখে।
JavaScript Tilde operation (1's complement)
BASE2 lens
~0001 -> 1110 - end result of ~ bitwise operation
BASE10 Signed lens (typical JS implementation)
~1 -> -2
BASE10 Unsigned lens
~1 -> 14
উপরের সমস্ত একই সাথে সত্য।