JavaRush /وبلاگ جاوا /Random-FA /عملگرهای منطقی در جاوا

عملگرهای منطقی در جاوا

در گروه منتشر شد
عملیات منطقی در جاوا  عملیات بیتی در جاوا - 1

عملیات منطقی در جاوا

عملیات منطقی با استفاده از عملگرهای بولی انجام می شود. توتولوژی را ببخشید، اما اوضاع دقیقاً اینگونه است. عملیات منطقی پایه (در برنامه نویسی و ریاضیات) را می توان برای آرگومان های منطقی (عملوندها) به کار برد، و همچنین می تواند برای تشکیل عبارات پیچیده تر، مشابه عملیات حسابی روی اعداد، استفاده شود. به عنوان مثال عبارت:

(a | b) | (c < 100) & !(true) ^ (q == 5)
یک عبارت منطقی پیچیده با چهار عملوند است: (a | b), Where аand bare متغیرهای نوع.به boolean (c < 100) (true) (q == 5) نوبه خود، یک عبارت منطقی ساده (a | b)نیز از دو آرگومان عملوند تشکیل شده است. عملوند منطقی عبارتی است که می توان گفت درست یا نادرست، درست یا نادرست است . در زبان جاوا، عملوند Boolean عبارتی از نوع booleanیا Boolean است، برای مثال:
  • (2 < 1)- عملوند منطقی، مقدار آن نادرست است
  • true- یک عملوند منطقی که مقدار آن آشکارا درست است
  • boolean a- همچنین می تواند یک عملوند منطقی باشد، مانند a Boolean
  • int a = 2- یک عملوند منطقی نیست ، فقط یک متغیر از نوع استint
  • String a = "true"همچنین یک عملوند منطقی نیست . این رشته ای است که مقدار متن آن "true".
عملیات منطقی زیر در جاوا موجود است:
  • نفی منطقی که به عنوان وارونگی نیز شناخته می شود NOT. !در جاوا قبل از عملوند با علامت “ ” نشان داده می شود . برای یک عملوند اعمال می شود.
  • منطقی و ، آن نیز ANDیک ربط است. با نماد " &" بین دو عملوندی که به آن اعمال می شود نشان داده می شود.
  • منطقی و یا در جاوا ، آن نیز - است OR، آن نیز تفکیک است. در جاوا با علامت “ |” بین دو عملوند نشان داده می شود.
  • انحصاری یا , XOR, تفکیک شدید. در جاوا با علامت “ ^” بین دو عملوند نشان داده می شود.
  • در جاوا، عملگرهای منطقی عبارتند از شرطی یا ، که با نشان داده می شود ||، و همچنین شرطی و - &&.
نکته: در منطق ریاضی نیز رابطه هم ارزی و به عبارتی برابری را در نظر می گیرند. اما در جاوا عملگر برابری==یک عملگر منطقی در نظر گرفته نمی شود. توجه! در جاوا، عملگرهای منطقی&و|همچنین^به اعداد صحیح اعمال می شود. در این مورد، آنها کمی متفاوت عمل می کنند و عملگرهای منطقی بیتی (یا بیتی) نامیده می شوند. درباره آنها - تا پایان مقاله. بیایید به جدولی با توضیحات مختصری در مورد هر یک از عملگرهای منطقی جاوا نگاه کنیم و در زیر آنها را با جزئیات بیشتر توضیح داده و نمونه کدهایی را ارائه خواهیم کرد.
اپراتور جاوا نام تایپ کنید توضیح کوتاه مثال
! منطقی "نه" (نفی) یگانه !xبه معنی "x نه" است. اگر عملوند نادرست باشد true را برمی گرداند . اگر عملوند true باشد false را برمی گرداند . boolean x = true;
سپس
// !x == false
& منطقی و ( AND، ضرب) دودویی اگر هر دو عملوند true باشند true را برمی گرداند . a = true;
b = false;
سپس
a & b == false
| یا منطقی ( OR، اضافه) دودویی اگر حداقل یکی از عملوندها درست باشد، true را برمی گرداند . a = true;
b = false;
سپس
a | b == true
^ انحصاری منطقی OR ( XOR) دودویی اگر یک و تنها یکی از عملوندها درست باشد، true را برمی گرداند . اگر هر دو عملوند درست یا نادرست باشند، false را برمی‌گرداند . در اصل، اگر عملوندها متفاوت باشند، مقدار true را برمی گرداند. a = true;
b = false;
سپس
a ^ b == true
&& شرطی AND (کوتاه منطقی AND) دودویی همانند، &اما اگر عملوند سمت چپ false& باشد ، این عملگر بدون بررسی عملوند دوم، false را برمی‌گرداند.
|| OR شرطی (OR منطقی کوتاه) دودویی همانند، |اما اگر عملگر سمت چپ true باشد ، عملگر true را بدون بررسی عملوند دوم برمی گرداند.

عملیات منطقی در دوره JavaRush

هیچ گریزی از عملیات منطقی وجود ندارد و در دوره JavaRush از اولین سطوح به همراه شرایط و نوع داده بولی ظاهر می شوند. برنامه نویسان به تدریج یاد می گیرند که از روش های منطق ریاضی استفاده کنند. برای دستکاری های مطمئن تر با ساختارهای منطقی، مهارت و درک خاصی از فرآیندهای خاص مورد نیاز است. بنابراین، این عملیات با جزئیات بیشتر و در سطح کاملاً متفاوتی در پایان جستجوی Multithreading مورد بررسی قرار می‌گیرند، زمانی که بیشتر دانش‌آموزان دیگر مستقیماً توسط نحو و ساختارها منحرف نمی‌شوند، بلکه سعی می‌کنند در اصل تکلیف عمیق شوند.

عملیات منطقی در جاوا  عملیات بیتی در جاوا - 2

عملگر نفی منطقی!

این عملگر unary است، به این معنی که برای یک عبارت یا عملوند بولی منفرد اعمال می شود. درک آن، مانند هر نفی، بسیار ساده است: عملگر به سادگی معنای عبارت را به مخالف خود تغییر می دهد. جدول حقیقت یا نتایج انجام یک عملیات نفی:
ارزش a
نادرست درست است، واقعی
درست است، واقعی نادرست
مثال. عملیات نفی منطقی
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       System.out.println(!a); // here our boolean expression reverses its value
       System.out.println(!false); // non-false expression, as you might guess, will be equal to... what?
       System.out.println(!(2 < 5)); // expression (2 < 5) is true, so its negation is false

   }
}
خروجی برنامه به صورت زیر خواهد بود:

false
true
false

AND - & منطقی و همچنین شرطی AND - &&

AND یا ربط منطقی به دو عبارت اعمال می شود و نتیجه آن تنها در صورتی درست خواهد بود که هر دو عملوند درست باشند. یعنی اگر یکی از عملوندهای aیا falseb باشد ، بدون توجه به مقدار عملگر دوم، عبارت نادرست خواهد بود . اگر تصور کنید درست عدد 1 و نادرست 0 است، عملگر دقیقاً مانند ضرب معمولی عمل می کند. بنابراین، AND منطقی اغلب "ضرب منطقی" نامیده می شود. و به هر حال، این واقعیت کمک می کند تا به سرعت عملکرد اپراتور را به خاطر بسپارید و آن را با منطقی یا اپراتور اشتباه نگیرید . جدول حقیقت و همچنین نتیجه کار اپراتور استa & b&&|&
آ ب a&b
درست است، واقعی درست است، واقعی درست است، واقعی
درست است، واقعی نادرست نادرست
نادرست درست است، واقعی نادرست
نادرست نادرست نادرست
منطقی و، همچنین یک ربط است، مثال‌هایی:
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       boolean c = true;
       System.out.println(a & b); // if we multiply true by false, we will definitely get false
       System.out.println(a & c); // true to true will be true
       System.out.println(false & (2 > 5));
 System.out.println((2 < 5) & false);
 // regardless of the truthfulness of the expression in brackets, in which case we have to be content with false
   }
}
نتیجه برنامه:

false
true
false
false
اپراتور &&گاهی اوقات "کوتاه و" نامیده می شود. هنگام کار با عملوندهای منطقی همان نتیجه ای را ایجاد می کند که عملگر &. با این حال، در خود کار او تفاوت وجود دارد. بنابراین، قبلاً متوجه شده اید که اگر a & bعملوند در عبارت () نادرستa باشد ، بررسی مقدار عملوند بی معنی است : نتیجه عملیات قطعاً نادرست خواهد بود . بنابراین اگر اساساً به مقدار عملوند دوم نیاز نداریم، با استفاده از آن تعداد محاسبات در برنامه را کاهش می دهیم. اگر همه عملگرهای مثال را با . جایگزین کنیم ، نتیجه دقیقاً یکسان خواهد بود، اما خود برنامه کمی سریعتر اجرا می شود (البته ما متوجه این نمی شویم، زیرا ما در مورد mili-micro صحبت می کنیم ... به طور خلاصه. ، واحدهای بسیار کوچک زمان). b&&&&&

OR منطقی عملگر | است و همچنین OR شرطی عملگر || است

عملگر OR در جاوا با نماد نمایش داده می شود |. یک OR یا تفکیک منطقی به دو عبارت اعمال می‌شود و نتیجه آن نادرست خواهد بود اگر و فقط اگر هر دو عملوند نادرست باشند. در اینجا ما تا حدودی همان تصویری را که در مورد اپراتور وجود دارد مشاهده می کنیم &، اما دقیقاً برعکس. یعنی اگر حداقل یک عملوند درست باشد، بدون در نظر گرفتن مقدار عملگر دوم، بیان a | bتضمین می‌شود که درست باشد. اگر &مانند ضرب منطقی عمل می کند، OR جمع منطقی است، اگر تصور کنید درست 1 و نادرست 0 است. فقط به یاد داشته باشید که جمع منطقی متفاوت از جمع عادی عمل می کند. 1 + 1 در این مورد برابر با 2 نیست، بلکه برابر است با 1 (عدد 2 به سادگی در این سیستم وجود ندارد). گاهی اوقات تفکیک به عنوان حداکثر 0 و 1 درک می شود، و در این مورد، اگر حداقل یک عملوند برابر با 1 ( true ) باشد، دقیقاً درست است . جدول حقیقت OR که به عنوان نتیجه عملگر نیز شناخته می شود |:
آ ب یک | ب
درست است، واقعی درست است، واقعی درست است، واقعی
درست است، واقعی نادرست درست است، واقعی
نادرست درست است، واقعی درست است، واقعی
نادرست نادرست نادرست
OR منطقی، همچنین به عنوان جدایی شناخته می شود، مثال:
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       boolean c = true;
       System.out.println(!a | b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
       System.out.println(a | c);
       System.out.println((2 < 5) | false); // expression (2 < 5) is true, which means that for any second operand we get a true result
       System.out.println((2 > 5) | true);

   }
}
نتیجه:

false
true
true
true
اگر از عملگر OR شرطی استفاده کنیم - ||به جای |, دقیقاً همان نتیجه را خواهیم گرفت، اما، مانند مورد شرطی AND ، از نظر اقتصادی عمل می کند: اگر با اولین عملوند برابر true&& مواجه شویم ، مقدار عملوند دوم بررسی نمی شود، اما بلافاصله نتیجه درست است .

XOR جاوا - منطقی انحصاری OR - اپراتور ^

XOR، جمع مدول 2، XOR منطقی، تفریق منطقی، تفکیک دقیق، متمم بیتی ... این عملگر ^در جبر بولی نام های زیادی دارد. نتیجه اعمال این عملگر به دو عملوند در صورت متفاوت بودن عملوندها درست و اگر عملوندها یکسان باشند، نادرست خواهد بود. بنابراین، مقایسه آن با تفریق صفر ( نادرست ) و یک ( درست ) راحت است. جدول حقیقت XORکه به عنوان نتیجه عملگر نیز شناخته می شود ^:
بولی الف بولی ب a^b
درست است، واقعی درست است، واقعی نادرست
درست است، واقعی نادرست درست است، واقعی
نادرست درست است، واقعی درست است، واقعی
نادرست نادرست نادرست
مثال:
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       boolean c = true;
       System.out.println(!a ^ b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
       System.out.println(a ^ c);
       System.out.println((2 < 5) ^ false);
       System.out.println((2 > 5) ^ true);
   }
}
نتیجه:

false
false
true
true

اولویت عملیات منطقی

همانطور که در ریاضیات، در برنامه نویسی، عملگرها زمانی که در یک عبارت ظاهر می شوند، ترتیب اجرای خاصی دارند. عملگرهای Unary نسبت به عملگرهای باینری و ضرب (حتی منطقی) نسبت به جمع برتری دارند. ما اپراتورهای منطقی را بالاتر در لیست رتبه بندی کرده ایم که اولویت آنها بیشتر است:
  1. !
  2. &
  3. ^
  4. |
  5. &&
  6. ||
بیایید به نمونه هایی نگاه کنیم. حروف ربط و منفصل ( &و |) دارای تقدم متفاوت هستند:
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println(a | b & c);
}
اگر بخواهیم از چپ به راست پیش برویم، یعنی ابتدا عملگر را اعمال کنیم |و سپس - &مقدار false را دریافت می کنیم . اما در واقع، اگر این برنامه را اجرا کنید، مطمئن خواهید بود که خروجی درست خواهد بود ، زیرا عملگر منطقی AND &اولویت بیشتری نسبت به عملگر منطقی OR دارد |. برای جلوگیری از سردرگمی، باید به خاطر داشته باشید که چه چیزی &شبیه ضرب و |چه چیزی شبیه جمع است. می توانید ترتیب اولویت را تغییر دهید. مثل ریاضی مدرسه فقط از براکت استفاده کنید. بیایید کد مثال خود را کمی تغییر دهیم:
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println((a|b)&c);
}
چه خبر؟ ابتدا از جمع منطقی در پرانتز و سپس ضرب استفاده می کنیم. نتیجه نادرست خواهد بود .

عبارات منطقی پیچیده

البته ما می توانیم عبارات بولی و عملگرها را با هم ترکیب کنیم. بیایید عبارت از ابتدای مقاله را به خاطر بسپاریم:
(a | b) | (c < 100) & !(true) ^ (q == 5)
حالا خیلی ترسناک به نظر نمی رسد. بیایید برنامه ای بنویسیم که مقدار آن را نمایش دهد و قبلاً مقادیر a، bو сو را تعیین کرده باشد q. مثالی از محاسبه مقدار یک عبارت بولی پیچیده
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       int c = 25;
       int q = 2;
       System.out.println((a|b) | (c < 100) & !(true)^(q == 5));
   }
}
توجه داشته باشید:متغیر qما از نوع است int، اما این یک عبارت Boolean است، و برابر با falseq == 5 است ، زیرا در بالا با عدد 2 مقداردهی اولیه کردیم. در مورد متغیر نیز همینطور است . این عدد برابر با 25 است، اما (c < 100) یک عبارت بولی برابر با true است . نتیجه این برنامه: qc

true
عبارات بولی پیچیده را می توان برای آزمایش شرایط بسیار پیچیده و شاخه ای استفاده کرد، اما نباید بیش از حد از آنها استفاده کرد: آنها خواندن کد را دشوار می کنند.

عملگرهای بیتی (بیتی).

در ابتدای مقاله اشاره کردیم که عملگرها &و |می ^توانند در رابطه با انواع عدد صحیح جاوا استفاده شوند. در این مورد آنها عملگرهای بیتی هستند. به آنها بیتی نیز می گویند، زیرا یک رقم یک بیت است و این عملیات به طور خاص با بیت ها کار می کند. البته، آنها تا حدودی متفاوت از عملگرهای منطقی عمل می کنند، و برای درک دقیق چگونگی، باید بدانید که یک سیستم اعداد باینری چیست. اگر چیزی در مورد آن نمی دانید یا کاملاً فراموش کرده اید، پیشنهاد می کنیم ابتدا مقاله جاوا: بیت ها و بایت ها را بخوانید و به دیگران یادآوری کنید که در سیستم اعداد باینری فقط دو رقم وجود دارد - 0 و 1 و همه داده ها. در رایانه دقیقاً با استفاده از صفر و یک های شرطی نشان داده می شود. هر یک از اعدادی که به آنها عادت داریم (اعشاری؛ برای آنها 10 رقم مختلف از 0 تا 9 وجود دارد که هر عددی را با آنها می نویسیم) را می توان در سیستم اعداد باینری نشان داد. شما می توانید یک عدد اعشاری را با استفاده از تقسیم ترتیبی به یک ستون با استفاده از پایه سیستم اعداد (2) به باینری تبدیل کنید. باقی مانده تقسیم در هر مرحله که به ترتیب معکوس نوشته می شود، عدد باینری مورد نظر را به ما می دهد. برای مثال، در اینجا، تبدیل عدد اعشاری 103 به نمایش باینری است: عملیات منطقی در جاوا  عملیات بیتی در جاوا - 3

سیستم اعداد باینری در دوره JavaRush

در دوره JavaRush، هنگام مطالعه کوئست MultiThreading (سطح 10، سخنرانی 1) در مورد سیستم اعداد باینری صحبت می کنند؛ پس از سخنرانی چندین کار برای تثبیت وجود دارد. با این حال، این موضوع به هیچ وجه دشوار نیست، و حتی اگر هنوز در این دوره تا این حد پیش نرفتید، احتمالاً آن را متوجه خواهید شد.

علاوه بر و &جاوا از عملگرهای بیتی نیز استفاده می کند: |^
  • ~ عملگر نفی بیتی
  • >>تغییر بیت به راست
  • >>>تغییر بیتی بدون علامت به راست
  • <<تغییر بیت به چپ
برای مبتدیان، عملگرهای بیتی بسیار گیج کننده و مصنوعی به نظر می رسند. آنها اغلب نمی دانند که برای چه چیزی به جز حل مشکلات آموزشی نیاز دارند. در واقع می توان از آنها حداقل برای سازماندهی تقسیم و ضرب کارآمد استفاده کرد و متخصصان از آنها برای رمزگذاری/رمزگشایی، رمزگذاری و تولید اعداد تصادفی استفاده می کنند.

عملگرهای بیتی &, | و ^

بیایید به مثالی از نحوه عملکرد این اپراتورها نگاه کنیم. فرض کنید دو عدد صحیح داریم:
int a = 25;
int b = 112; 
ما باید سه عملیات را روی آنها اعمال کنیم و &نتیجه را روی صفحه نمایش دهیم. این هم کد برنامه: |^
public class Solution {
   public static void main(String[] args) {

       int a = 25;
       int b = 112;

       int res1 = a & b;
       int res2 = a | b;
       int res3 = a ^ b;

       System.out.println("a & b = " + res1);
       System.out.println("a | b = " + res2);
       System.out.println("a ^ b = " + res3);

   }
}
نتیجه برنامه به شرح زیر است:

a & b = 16
a | b = 121
a ^ b = 105
اگر متوجه نشدید که چه اتفاقی می افتد، نتیجه بسیار بسیار مرموز به نظر می رسد. در واقع همه چیز ساده تر از چیزی است که به نظر می رسد. عملگرهای بیتی اعداد عملوند را به شکل باینری خود می بینند. و سپس عملگرهای منطقی یا به ارقام (بیت) مربوطه هر دو عدد را اعمال &می کنند |. ^بنابراین، برای &آخرین بیت از نمایش دودویی عدد 25 به طور منطقی به آخرین بیت از نمایش دودویی عدد 112، بیت ماقبل آخر با ماقبل آخر، و غیره جمع می شود: عملیات منطقی در جاوا  عملیات بیتی در جاوا - 4همین منطق را می توان در مورد |و ^. عملیات منطقی در جاوا  عملیات بیتی در جاوا - 5

تغییر بیت به چپ یا راست

چند عملگر bit shift در جاوا وجود دارد. متداول ترین عملگرهای مورد استفاده <<عبارتند از و >>. آنها نمایش دودویی یک عدد را به ترتیب به چپ یا راست، و در صورت جابجایی به راست، با حفظ علامت تغییر می دهند (در زیر توضیح خواهیم داد که حفظ علامت به چه معناست). یک اپراتور شیفت راست دیگر وجود دارد >>>. همین کار را می کند اما >>علامت را ذخیره نمی کند. بنابراین، بیایید با استفاده از یک مثال به کار آنها نگاه کنیم. int a = 13 a << 1تمام بیت های نمایش باینری عدد a را 1 بیت به چپ منتقل می کند. برای ساده تر، اجازه دهید عدد 13 را به صورت باینری به صورت 0000 1101 نشان دهیم. در واقع، این عدد به این صورت است: 00000000 00000000 00000000 00001101، زیرا جاوا int4 بایت یا 32 بیت را برای اعداد اختصاص می دهد. اما این در مثال نقشی ندارد، بنابراین در این مثال عدد خود را یک بایت در نظر می گیریم. عملیات منطقی در جاوا  عملیات بیتی در جاوا - 6بیت خالی در سمت راست با صفر پر شده است. در نتیجه این عمل عدد 26 را بدست می آوریم. a << 2تمام بیت های نمایش باینری عدد را a2 بیت به چپ منتقل می کند و دو بیت خالی در سمت راست با صفر پر می شوند. در نتیجه عدد 52 را بدست می آوریم a << 3نتیجه 104 می شود... به الگو توجه کنید؟ جابجایی بیتی aبه سمت چپ با n موقعیت مانند ضرب یک عدد aدر 2 به توان n عمل می کند. همین امر در مورد اعداد منفی نیز صدق می کند. این -13 << 3نتیجه -104 را به دست می دهد. a >> nنمایش دودویی یک عدد n موقعیت را به سمت راست منتقل می کند. به عنوان مثال، 13 >> 1 عدد 1101 را به عدد 0110 یعنی 6 تبدیل می کند. و 13 >> 2نتیجه 3 می شود. یعنی در اصل، در اینجا عدد را بر 2 تقسیم می کنیم به توان n که n تعداد جابجایی ها است. به سمت راست، اما با یک اخطار: اگر عدد فرد باشد، در طول این عملیات به نظر می رسد که آخرین بیت عدد را بازنشانی می کنیم. اما با موارد منفی وضعیت تا حدودی متفاوت است. فرض کنید، اگر از برنامه بخواهید عملیاتی را انجام دهد، بررسی کنید که چه چیزی تولید می کند -13 >> 1. همانطور که فکر می کنید عدد -7 را خواهید دید نه -6. این به دلیل نحوه ذخیره اعداد منفی در جاوا و سایر زبان های برنامه نویسی است. آنها در چیزی که کد مکمل نامیده می شود ذخیره می شوند. در این حالت، مهم ترین رقم (در سمت چپ) به علامت داده می شود. در مورد یک عدد منفی، مهم ترین رقم 1 است.

کد اضافی

بیایید عدد را در نظر بگیریم int a = 13. اگر در برنامه نمایش باینری آن را با استفاده از دستور در کنسول چاپ کنید System.out.println(Integer.toBinaryString(a));، 1101 دریافت می کنیم. در واقع، این یک نماد کوتاه است، زیرا شماره نوع int4 بایت در حافظه اشغال می کند، بنابراین رایانه آن را بیشتر می بیند. مثل این:

00000000 00000000 00000000 00001101
مهم ترین رقم صفر است، یعنی یک عدد مثبت داریم. برای تبدیل به کد اضافی:
  1. ما عدد -13 را در اصطلاح "کد مستقیم" می نویسیم. برای انجام این کار، مهم ترین رقم عدد را به 1 تغییر دهید
    . نتیجه عمل:

    
    10000000 0000000 0000000 00001101
  2. بعد، همه بیت ها را معکوس می کنیم (0 را به 1 و 1 را به 0 تغییر می دهیم) به جز بیت علامت. در واقع، ما قبلاً آن را تغییر داده ایم.
    نتیجه عمل:

    
    11111111 11111111 11111111 11110010

    (بله، مراحل 1 و 2 را می توان با هم ترکیب کرد، اما بهتر است به آن فکر کنید)

  3. 1 را به عدد حاصل اضافه کنید.
    نتیجه عمل:

    
    11111111 11111111 11111111 11110011
عدد باینری حاصل 13- است که در کد مکمل دو نوشته شده است و تغییر بیت (و سایر عملیات) به طور خاص برای آن اعمال خواهد شد. فقط این است که تفاوت در منطق عملیات در همه عملیات محسوس نیست. فرض کنید، برای همان جابجایی به چپ، تفاوت قابل توجه نیست؛ ما می‌توانیم با اعداد منفی به همان روشی که با اعداد مثبت کار کنیم. حالا بیایید به سمت راست حرکت کنیم -13 >> 1. از آنجایی که اپراتور ما >>علامت را حفظ می کند، در این عملیات تمام بیت های آزاد شده در سمت چپ نه با صفر، بلکه با یک پر می شوند. بنابراین، تغییر شماره

11111111 11111111 11111111 11110011
یک بیت به سمت راست، که به ترتیب بیت های زیر منجر می شود:

11111111 11111111 11111111 11111001
اگر این عدد را به کد مستقیم تبدیل کنیم (یعنی ابتدا 1 را کم کنیم، سپس همه بیت ها را به جز اولی معکوس کنیم) عدد بدست می آید:

10000000 00000000 00000000 00000111
یا -7. اکنون که عملگر شیفت سمت راست حفظ علامت را فهمیدیم، مشخص خواهد شد که چه تفاوتی با عملگر دارد >>>. a >>> n- این عملیات یک شیفت بدون علامت است، یعنی نمایش دودویی یک عدد را aبا n بیت به سمت راست تغییر می دهد، اما n بیت خالی در سمت چپ را نه با یک، مانند عملگر >>، بلکه با صفر پر می کند. بیایید عملیات را انجام دهیم -13 >>> 1. ما قبلاً عدد را -13در مکمل دو داریم:

11111111 11111111 11111111 11110011
با جابجایی 1 بیتی به سمت راست و پر کردن بیت آزاد با صفر عدد زیر را بدست می آوریم:

01111111 11111111 11111111 11111001
چه چیزی عدد را در نماد اعشاری می دهد 2147483641.

عملگر نفی بیتی ~

این عملگر یکنواخت بسیار ساده کار می کند: هر بیت از نمایش باینری یک عدد صحیح را معکوس می کند. بیایید عدد را بگیریم -13:

11111111 11111111 11111111 11110011
عملیات نفی بیتی ~13به سادگی مقدار هر بیت را معکوس می کند. در نتیجه دریافت می کنیم:

00000000 00000000 00000000 00001100
یا 12به صورت اعشاری.

نتیجه گیری مختصر

  • همه عملگرهای منطقی برای عبارات بولی اعمال می شوند، یعنی آنهایی که می توان گفت درست یا نادرست هستند .
  • Если операторы &, | or ^ применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения or вычитания.
  • В математической логике операторам & и | соответствуют конъюнкция и дизъюнкция.
  • Логическое И похоже на умножения 1 (true) и 0 (false).
  • Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
  • Для побитового отрицания целого числа a используется операция ~a.
  • Для логического отрицания булевского выражения a используется операция !a.
  • Отрицательные числа хранятся и обрабатываются в дополнительном codeе.
  • Поразрядный сдвиг вправо может сохранять знак (>>), а может — не сохранять (>>>).
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION