বুলিয়ান্সে বিটওয়াইজ অপারেশন কীভাবে কাজ করে?


26

আমি এডাবাইটের উপরে এই চ্যালেঞ্জটি পেরিয়ে এসেছি এবং এই বিটওয়াইজ অপারেশন সমাধানটি কার্যকর করতে পারিনি।

notNotNot = (a,b) => !!(a%2 >> b)

চ্যালেঞ্জ:

//Something which is not true is false, but something which is not not true is true! 
//Create a function where given n number of "not", evaluate whether it's true or false.

//Examples:
notNotNot(1, true)  false
// Not true

notNotNot(2, false)  false
// Not not false

notNotNot(6, true)  true
// Not not not not not not true

আমি কিছু গবেষণা করেছি যে সেই অপারেটর:

বাম দিক থেকে বামদিকের বিটের অনুলিপিগুলি দিয়ে ডানদিকে স্থানান্তর করুন এবং ডানদিকের বিটগুলি পড়তে দিন।

আমি মনে করে যে, আমি বুঝতে (যেমন 5 >> 1হিসাবে একই 0101 >> 1যা মূল্যায়ণ 0010), কিন্তু আমি দেখতে পারছি না কিভাবে একটি বুলিয়ান সঙ্গে যে কাজ? আমি জানি trueমূল্যায়ণ 1এবং falseকরতে 0


3
একটি বুলিয়ান কেবল একটি সংখ্যায় রুপান্তরিত হতে চলেছে এবং তারপরে শিফটটি ঘটবে, সুতরাং true= 1(দশমিক) = 01(বাইনারি) একের বামে স্থানান্তরিত হয়ে 10বাইনারি বা 2দশমিক উত্পাদিত হবে ।
ভিএলএজ

আসলে, এই সমাধানটি ভুল। উপরোক্ত ক্ষেত্রে এটি কাজ করবে, তবে বিবেচনা করুন notNotNot(2, true): এটি ফিরে আসবে false, তবে সত্য হবে না ( !!true) হওয়া উচিত true...
এফজেডস

@FZs এটি সঠিক। ফাংশনটি falseসমাধান করার জন্য কেবলমাত্র একটি বিজোড় সংখ্যার বিবেচনা করবে true
ভিএলএজে

2
আমি notNotNot = (a,b) => !!((a%2)^b)পরিবর্তে বলব ...
এফজেডস

শুধু কেন নয় (a, b) => !!((a + b) % 2)?
জোনাস উইলস

উত্তর:


16

আপনি যে ফাংশনটি দিয়েছেন তা চ্যালেঞ্জকে মেটায় না ডান স্থানান্তর চাওয়া হয় না। উদাহরণস্বরূপ, আপনার notNotNot(6,true)এটি যখন আপনার ফাংশনটির মাধ্যমে রাখা হয় falseনা true

আপনার প্রশ্নটি যদিও বুলিয়ানটিতে বিটওয়াইজ অপারেশন সম্পর্কিত। অপারেটরগুলি যেহেতু পছন্দসই >>এবং <<পূর্ণসংখ্যার উপর কাজ করে, জাভাস্ক্রিপ্ট প্রথমে বুলিয়ান মানকে একটি পূর্ণসংখ্যায় রূপান্তর করে। সুতরাং true1 হয় এবং false0 হয়। এটি দেখতে আপনি শূন্য দ্বারা স্থানান্তর করতে পারেন:

console.log("true is",true >> 0)
console.log("false is", false >> 0)
সুতরাং বুলিয়ান্সে বিটওয়াইজ অপারেশনটি কেবল 0 বা 1 এর বিটওয়াইজ অপারেশন।

!!যে কোনও কিছুকে বুলিয়ানে রূপান্তর করার সহজ উপায় Using এটি এমন কোনও কিছু গ্রহণ করে যা মিথ্যা (যেমন 0 null, undefinedবা "") এর সমতুল্য বিবেচিত হবে এবং ফিরে দেয় false। একইভাবে সত্য যে কোনও কিছু (যেমন 14, "হ্যালো", [4], {এ: 1}) এবং ফেরত দেয় true!!কাজ করে কারণ প্রথম বিস্ময়বোধক চিহ্নটি সর্বদা trueবা যা প্রকাশের পরে 'না' দেয় false, তারপরে দ্বিতীয় বিস্মরণ চিহ্নটি ( falseবা true) এর বিপরীত দেয় ।

চ্যালেঞ্জ ফিরে পেতে, এটি নট-অপারেটর 'a' বার প্রয়োগ করতে এবং 'b' মানের সাথে তুলনা করতে চায়। সুতরাং এর মতো কিছু কাজ করবে:

function notNotNot(a, b) { return !!(a%2 - b); }
console.log("notNotNot(1, true)",notNotNot(1, true));
console.log("notNotNot(2, false)",notNotNot(2, false));
console.log("notNotNot(6, true)",notNotNot(6, true));


9
আমি মনে করি "চ্যালেঞ্জ" সত্যিই আপনি বুঝতে চান যে আপনি কোনও লুপ ছাড়াই এটি সহজেই করতে পারেন ...
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

2
@ ব্লুরাজা-ড্যানিফ্লুঘুফুট লুপ ছাড়াই এটি করার সহজ উপায় if (a % 2 === 1) return !b else return bকিন্তু অন্যান্য উত্তরে যেমন দেখানো হয়েছে সেখানে শাখা বা লুপ ছাড়াই এটি করার উপায় রয়েছে।
ভিএলএজ

হ্যাঁ, তবে প্রশ্নটি চ্যালেঞ্জটি করার বিষয়ে নয় - এটি ছিল কীভাবে বিটওয়াইজ অপারেটর এবং বুলিয়ান মান। তবে আমি আমার উত্তরটি একটি নন-লুপ এবং অ-যদি উপায় দিয়ে আপডেট করেছি।
সর্বদা

14

বিটওয়াইজ অপারেটররা সর্বদা তাদের অপারেশনগুলিকে একটি পূর্ণসংখ্যায় রূপান্তর করে। সুতরাং, 4 >> trueএকই হিসাবে 4 >> 1যা ডান এক অবস্থান থেকে কিছুটা শিফট করবে

(decimal) 4 = (binary) 100

(binary) 100 >> 1 = (binary) 010

(binary) 010 = (decimal) 2

console.log(4 >> true);

সুতরাং, ব্যবহার trueবা falseব্যবহার করার একটা ঝোঁক শুধু একটি চৌমাথা উপায় 1বা 0

notNotNotফাংশন খুব সহজ অপারেশন সামগ্রিক হয়েছে:

  1. a%2প্রথম সংখ্যাকে সমান 0বা 1বিজোড়ের জন্য রূপান্তর করে ।
  2. >> bউভয় 0অবস্থানের জন্য falseবা 1অবস্থানের জন্য ডান স্থানান্তরিত করুন true
    • aহয় বিজোড় (1) এবং bহয় false=1
      • ডানদিকে শূন্য শিফট রয়েছে, সুতরাং সংখ্যাটি একই থাকে।
    • aহয় বিজোড় (1) এবং bহয় true=0
      • শুধুমাত্র সেট বিট 1ডান স্থানান্তরিত এবং বাতিল করা হয়।
    • aসমান (0) এবং bহয় false=0
      • ডানদিকে শূন্য শিফট রয়েছে, সুতরাং সংখ্যাটি একই থাকে।
    • aসমান (0) এবং bহয় true=0
      • বেস নম্বরটি 0যার কোনও বিট সেট নেই, তাই কোনও পরিমাণে স্থানান্তর করা এটি পরিবর্তন করে না।
  3. !!() ফলাফলকে বুলেয়ানে রূপান্তরিত করে।

এই বলে যে, এখানে সমাধানটি ভুল, যেহেতু notNotNot(2, true)উত্পাদন করবে false- aসমান এবং bহয় true। প্রত্যাশাটি trueযেহেতু এটি উত্পাদন করবে !!true = true। একই সমস্যাটি যে কোনও সংখ্যক এবং এর জন্য উপস্থিত true

ডান শিফটের পরিবর্তে বিটওয়াইজ এক্সওআর ব্যবহার করে এটি সহজেই ঠিক করা যেতে পারে:

  • aহয় বিজোড় (1) এবং bহয় false=1
    • উভয় ম্যাচ, তাই তারা উল্লিখিত হয় 0
  • aহয় বিজোড় (1) এবং bহয় true=0
    • তারা মেলে না, তাই আমরা পাই 1
  • aসমান (0) এবং bহয় false=0
    • উভয় ম্যাচ, তাই আমরা পেতে 0
  • aসমান (0) এবং bহয় true=1
    • তারা মেলে না, তাই আমরা পাই 1

notNotNot = (a,b) => !!(a%2 ^ b);

console.log("!!true = ", notNotNot(2, true))
console.log("!!!true =", notNotNot(3, true))
console.log("!!false = ", notNotNot(2, false))
console.log("!!!false = ", notNotNot(3, false))

//bonus
console.log("true = ", notNotNot(0, true))
console.log("false = ", notNotNot(0, false))

কেবল সম্পূর্ণতার জন্য, আপনি যদি পুরোপুরি বিটওয়াইজ অপারেশন চান:

মডুলো অপারেশনটি কিছুটা %2পরিবর্তিত হয়ে &1সর্বনিম্ন বিট পেতে পারে bit এমনকি সংখ্যার জন্য, এই উত্পাদ হবে 0যেহেতু আপনি কম্পিউটিং চাই

xxx0
&
0001

যা শূন্য। এবং বিজোড় সংখ্যার জন্য একই প্রয়োগ হয় তবে ফলস্বরূপ আপনি একটি পাবেন:

xxx1
&
0001

সুতরাং ফলাফল a&1এবং a%2অভিন্ন। তদ্ব্যতীত, যদিও বিটওয়াইজ অপারেশনগুলি সংখ্যাটি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যায় রূপান্তর করে যা প্যারিটি সংরক্ষণ করা হবে বলে কিছু যায় আসে না ।


4

প্রথমত, (a,b) => !!(a%2 >> b)উদাহরণগুলির ফলাফলের সাথে মেলে না। আমি এটি ব্যবহার করে যা করছি ঠিক তা ভেঙে ফেলব notNotNot(6, true) ➞ true

  • প্রথম a%2, কেবল a2 দ্বারা ভাগ করে বাকীটি ফিরে আসুন। সুতরাং আমরা একটি সংখ্যার জন্য 0 এবং একটি বিজোড় সংখ্যার জন্য 1 পাবো। a = 6 a%2 = 0এক্ষেত্রে.
  • তারপরে 0 >> b1 নম্বরটি ডান থেকে সরিয়ে নিন কারণ আপনি যেমনটি বলেছিলেন trueমূল্যায়ণ করেছেন 1। সুতরাং আমরা পেতে 0 >> 1 = 0
  • সর্বশেষে !!(0), সহজ, এবং !0 = trueতারপর , যেমন ভাঙ্গা হতে পারে !true = false

সুতরাং আমরা এই যতদিন আমার মনে হয় যদি bহয় true, আমরা সবসময় ফিরে পাবেন false। আসুন বলতে আমরা একটি = 5, বি = সত্যতে মূল্যায়নের আছে 5%2 = 1, 1 >> 1 = 0। মোডের কারণে আপনি দেখতে পাচ্ছেন ( %2) আমাদের কেবলমাত্র 1 বা 0 থাকবে (কেবল কখনও 1 ডিজিট থাকবে) এবং সত্য যখন আমাদের কাছে থাকে তখন সর্বদা 1 টি বন্ধ করে দেয়।

এই সমস্যাটি দেখার একটি সহজ উপায় একটি isEvenOrNotফাংশনের মতো । সুতরাং aসংখ্যা আমরা যাচাই করছি এবং bযদি এটা এমনকি (সত্য) এর চেক করতে বা এমনকি না (মিথ্যা) একটি বুলিয়ান। এটি কাজ করে কারণ প্রতিটি সেকেন্ড notযুক্ত সত্য হবে।

সুতরাং একটি সমাধান, bitwise ব্যবহার ভালো কিছু হতে পারে: (a,b) => !!(a&1 ^ b)। আমি আপনাকে ভেঙে ফেলার মজা দিতে দেব কেন এটি কাজ করে! :)

কীভাবে বুলেটিনের সাথে শিফট কাজ করে তা বোঝাতে আরও কিছুটা। সুতরাং trueআপনি যেমন বলেছিলেন 1 হবে এবং মিথ্যা 0 হবে। সুতরাং আপনার উদাহরণে প্রদর্শিত হিসাবে, 0101 >> trueএকই 0101 >> 1

আশা করি এটা কাজে লাগবে.

আমি বিটওয়াইজের জন্য নিম্নলিখিত হিসাবে রেফারেন্স হিসাবে ব্যবহার করেছি: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটর / বিটওয়াইস_ অপারেটর


1
(a%2)  //ignore all but the least significant bit (LSB)
(a%2 >> b )  //if TRUE,  shifts right, resolves to 0
               //if FALSE, no shift,     resolves to LSB

// 0 and LSB are both integers so convert to boolean by using logical/boolean NOT
!(a%2 >> b ) //resolves to the boolean which it is NOT
!!(a%2 >> b ) //resolves to the boolean which it is NOT NOT

এনবি, উভয়ই বুলিয়ানের জন্য, নোটের একটি এমনকি সংখ্যার ফলাফল মূল বুলিয়ানকে বিপরীত বুলিয়ান-এ ফলাফলের একটি বিজোড় সংখ্যার ফলাফল

যে কোনও সংখ্যার এলএসবি সংখ্যাটি বিজোড় বা সমান কিনা নির্ধারিত করে (0 এমনকি, 1 বিজোড়)


1

আমি দেখতে পাচ্ছি যে আপনার কাজটি হ'ল:

/* Create a function where given n number of "not",
   evaluate whether it's true or false.*/

আপনি কেন notnotnotআমার জন্য ফাংশন লিখছেন তা আমি জানি না যা টাস্কটি জিজ্ঞাসা করে না।

সুতরাং সেই কার্য অনুসারে আমি সেই ফাংশনটি তৈরি করে যা not বেশ কয়েকটি "নোট" গ্রহণ করে এবং তাদের মূল্যায়ন করে।

প্রথম উপায়

function not(n) {
  return Boolean(n - n - 1);
}

এক্সওআর (^) ব্যবহারের দ্বিতীয় উপায়

function not(n) {
  return Boolean(bool ^ (bool - 1));
}

মোড (%) ব্যবহার করে তৃতীয় উপায় @ ভ্ল্যাজ দ্বারা নির্দেশিত

function not(n) {
  return Boolean(n % 2);
}

বিটওয়াইস এবং (&) ব্যবহার করে চতুর্থ উপায়

function not(n) {
  return Boolean(n & 1);
}

পরীক্ষা

not(0)
//> false 
not(1)
//> true
not(2)
//> false
not(515)
//> true

1
বিট ম্যানিপুলেশন দরকারী এখানে, যেহেতু আমরা পরিমাণ যত্ন সম্পর্কে না হয় n, শুধুমাত্র তা জোড় না বিজোড় হয়, যেহেতু কোন দুটি নাস্তিমান আউট বাতিল তাই - !!!!!bহিসাবে একই !b। সুতরাং আমরা যদি কেবল এটি গ্রহণ করি তবে আমাদের কোনও লুপের প্রয়োজন নেই n%2- আমরা নোটের 1জন্য চাই এবং 0"এটি একই রাখি " " যেহেতু আমাদের একটি সংখ্যা রয়েছে, আমরা কেবল বিটওয়াইস অপারেশন করতে পারি।
ভিএলএজে

ঠিক আছে আমি সে সম্পর্কে ভাবিনি তবে আপনি ঠিক বলেছেন আমরা কেবল 0 এবং 1 এর সাথে আচরণ করছি, আপনাকে ধন্যবাদ, এটি একটি দরকারী মন্তব্য :)
সায়মনস্যাম

0

প্রথমে বিশ্লেষণ সমাধান করতে দেয়

notNotNot(oddNumber, true)   false
notNotNot(evenNumber, true)  true

notNotNot(oddNumber, false)   true
notNotNot(evenNumber, false)  false

এখন জন্য বিশ্লেষণ (a,b) => !!(a%2 >> b)

a%2 == 0  even number
a%2 == 1  odd number

// For a%2 == 0

a%2 >> b  if b is true   0 >> 1  0   // Not working
a%2 >> b  if b is false  0 >> 0  0


// For a%2 == 1

a%2 >> b  if b is true   1 >> 1  0
a%2 >> b  if b is false  1 >> 0  1

এখানেই মানে এই জন্য কাজ করছে না notNotNot(6, true)হয় trueকিন্তু বর্তমান সমাধান দেয় false

^এটির মতো করে সঠিক করতে আমরা আপনাকে (এক্সওআর) অপারেটরটি করতে পারি(a,b) => !!(a%2 ^ b)

এখন জন্য বিশ্লেষণ (a,b) => !!(a%2 ^ b)

a%2 == 0  even number
a%2 == 1  odd number

// For a%2 == 0

a%2 ^ b  if b is true   0 ^ 1  1   // Now working
a%2 ^ b  if b is false  0 ^ 0  0


// For a%2 == 1

a%2 ^ b  if b is true   1 ^ 1  0
a%2 ^ b  if b is false  1 ^ 0  1

!(a%2 ^ b) use `!` to make int as boolean but solution result will reversed then
!!(a%2 ^ b) use `!` again to reversed it again and make it correct.

উদাহরণ:

notNotNot = (a,b) => !!(a%2 ^ b);

console.log("!!!!true = ", notNotNot(4, true))
console.log("!!!!false = ", notNotNot(4, false))
console.log("!!!true =", notNotNot(3, true))
console.log("!!!false = ", notNotNot(3, false))

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