Логически операции с двоични кодове
Вижте също:- I. Понятие за банкова операция. Видове банкови операции и сделки.
- III. Анатомо-физиологични особености на храносмилателните органи и клинична и диагностична картина на заболявания на храносмилателната система в напреднала и старческа възраст.
- IV.5. Космологични модели
- VI. Анатомо-физиологични особености на дихателната система в напреднала и старческа възраст.
- VI. Операции на упълномощени банки с валутни ценности.
- X. Логически основи на компютрите. Кодиране на компютърни данни
- XIII. OS файлова структура. Файлови операции
- А. Неекспериментални психологически методи
- агентски операции.
- Адаптивни логически модули (ALM)
- Адитивни операции
- Правила за ударението.
Върху двоичните кодове могат да се извършват различни логически операции, сред които специално място заемат:
-логическо сумиране(означения - ИЛИ, ИЛИ, "Ú");
-
_ "x", (т.е. черта над |
-
-логическо отрицаниеобозначения - НЕ, НЕ, . отрицателен код x); |
Операцияталогическо сумиранесе извършва върху два кода и генерира код със същия капацитет като операндите, който има единица в някой i-ти бит, ако поне един операнд има единица в i-тия бит.
10001101 ^ 11110000 = 11111101.
Операцияталогическо умножениесе извършва върху два кода и генерира код със същия капацитет като операндите, който има единица в някаква i-та цифра, ако и дветеоперандът в този i-ти бит е единица и нула във всички останали случаи.
10001101 Ù 11110000 = 10000000
Операциятасумиране по модул 2се извършва върху два кода и генерира код със същия капацитет като операндите, който има единица в някоя i-та цифра, ако два дадени операнда в i-тата цифра имат противоположни стойности. Понякога тази операция се нарича "изключително ИЛИ".
10001101 Å 11110000 = 01111101.
Операцията на логическото отрицание се извършва върху един код и генерира резултатен код със същия капацитет като операнда, който има стойност в някакъв i-ти бит, която е противоположна на стойността в i-тия бит на отричания код.
Операциитеshiftот своя страна се разделят на:
- логически смени, които имат разновидности - преместване надясно, преместване наляво, циклично преместване надясно, циклично преместване наляво;
- аритметични премествания надясно и наляво, чието изпълнение зависи от знака и кода на изместваното число.
Преместванетоналявосе извършва чрез задаване на бита на стойността, съответстваща на първоначалната стойност в най-близкия най-малък значим бит (освободеният най-десен бит, т.е. най-младият, битът се запълва с 0, а „избутаният“ бит изчезва). Например кодът 11001110 след преместване наляво ще изглежда като 10011100.
Преместванетонадясносе извършва чрез задаване на бита на стойността, съответстваща на първоначалната стойност в най-близкия най-значим бит (освободеният най-ляв, т.е. най-старшият, бит се запълва с 0, "изтласканият" бит изчезва). Например кодът 11001110 след преместване наляво ще изглежда като 01100111.
Циклично изместване наляво- извършва се чрез задаване на стойност, съответстваща на първоначалната стойност в най-близкиянай-малката цифра (стойността на най-високата, т.е. най-лявата цифра на изходния код се въвежда в освободения най-десен, т.е. най-младият бит). Например кодът 11001110 след преместване наляво ще изглежда като 10011101.
Циклично изместване надясно- извършва се чрез задаване на стойност в бита, съответстваща на оригиналната стойност в най-близкия най-значим бит (стойността в най-младши значим бит от изходния код се запълва в освободения най-ляв бит, т.е. най-старшият бит). Например кодът 11001110 след преместване наляво ще изглежда като 01100111.
Аритметичните смени извършват умножения (ляви смени) или операции за деление (десни смени) на двоични кодове по две, точно както дясните и левите смени на десетично число извършват деление и умножение по 10.
Аритметичните леви измествания на двоичен директен код се извършват в зависимост от това дали числото, което се измества, е положително или отрицателно.
Акоизмества положителночисло, тогава изместването (наляво или надясно) се извършва като съответното логическо изместване (наляво или надясно), с единствената разлика, че е осигурено средство за определяне дали лявото изместване е преляло, което е същото за всички други аритметични операции. За всяка смяна надясно са осигурени средства за закръгляване след завършване на желания брой смени и средства за откриване, че изместената стойност е настроена на нула след следващата смяна.
Извършват се аритметични леви измествания на положителни двоични числа, независимо от използвания код (напред и назад, комплементарно). Изпълнението му е илюстрирано със следните примери.
1. Намерете резултата от аритметичното изместване наляво с три бита от двоичния директен код на числото [A]pk = 00. 00000101
Процесизвършването на дадена смяна дава следните междинни и крайни стойности:
първа смяна: 00.00000101à 00.00001010;
втора смяна: 00.00001010à 00.00010100;
трета смяна: 00.00010100à 00.00101000.
2. Намерете резултата от аритметичното изместване наляво с четири бита на двоичния директен код на числото [A]pc = 00. 00101000.
Даденият процес на смяна дава следните междинни и крайни стойности:
първа смяна: 00.00000101à 00.00001010;
втора смяна: 00.00001010à 00.00010100;
трета смяна: 00.10100000à 01.01000000.
След третата смяна ще се генерира сигнал за препълване, тъй като след следващата смяна в битовете на полето за знак ще се появят различни стойности. По този начин, освен процедурата за откриване на препълване, аритметичното ляво изместване се извършва по точно същия начин като логическото ляво изместване.
3. Намерете резултата от аритметичното изместване надясно с две цифри на двоичния директен код на числото [A]pk = 00. 00000110.
Даденият процес на смяна дава следните междинни и крайни стойности:
първа смяна: 00.00000110à 00.00000011;
втора смяна: 00.00000011à 00.00000001;
След извършване на посочения брой смени, закръгляването се извършва на базата на последната "изскочена" цифра; в този случай последният "изскочен" бит е 1, така че крайният резултат от извършването на даденото преместване ще бъде равен на
4. Намерете резултата от аритметичното изместване надясно с четири цифри на двоичния директен код на числото [A]pk = 00. 00000110.
Даденият процес на смяна дава следните междинни и крайни стойности:
първа смяна: 00.00000110à 00.00000011;
втора смяна: 00.00000011à 00.00000001;
трета смяна: 00.00000001à 00.00000000,
след извършване на третата смяна ще се генерира сигнал, че е получен нулев резултат. Останалите смени може да не се изпълняват.
Аритметични отмествания на отрицателни двоични числа, представени в директен код
Аритметичните премествания наляво и надясно се изпълняват по различен начин в зависимост както от знака на числото, така и от използвания код (напред назад, комплементарно).
При аритметично изместване на отрицателно двоично число, представено в директен код, съответно се измества само модулното поле на записа на числото.
Изпълнението на този тип смяна е илюстрирано със следните примери.
Извършетеаритметично преместваневляво от двоичното число A = 11. 001010 (съответства на 10 10), представено в модифицирания директен код.
Посоченото изместване, което има за цел да произведе резултат, който е два пъти по-голям от абсолютната стойност на стойността на изходния код, води до 11.010100 (2010), което се получава чрез логическо изместване наляво само на модулната част на изходния код. Фактът на получаване на препълване се установява от наличието на една стойност на най-значимия бит в изместения код преди следващото изместване.
Извършете аритметично изместване надясно на двоичното число A = 11. 01110 (1410), представено в модифицирания директен код.
Посоченото изместване, което има за цел да получи два пъти по-малък по абсолютна стойност код спрямо стойността на изходния код, води до числото 11.00111(710), което се получава чрез логическо изместване вляво само на модулната част на изходния код.
Аритметичното ляво изместване на отрицателно двоично число, представено в обратния код, завърта изходния код с контрол на препълване, например,ляво изместване на отрицателното двоично число 11.1100110(2510), представено в обратен код, води до 11.1001101(5010).
Аритметичното изместване вдясно на отрицателно двоично число, представено в обратния код, измества само модулната част от записа на числото със задаване на 1 на празния бит.В този случай може да се извърши контрол върху нулирането на резултата от смяната (поява на единични стойности във всички битове) и закръгляване на резултата след извършване на определен брой смени.
Преместете четирите цифри надясно от двоичното число 11.1001101 (десетичен еквивалент на 5010), представено в обратния код.
Първата промяна дава 11.11001101(5010) à 11.11100110(2510).
Второто изместване дава 11.11100110(2510)à 11.11110011(1210).
Третата промяна дава 11.11110011(1210)à 11.11111001(610).
Четвъртата промяна дава 11.11111001(610),.à 11.11111100(310).
При извършване на преместване надясно на нечетно число резултатът се получава до най-малката цифра на кода, като грешката е отрицателна.
След последното, четвърто преместване се извършва закръгляване, при което, ако последният "изскочен" бит е бил със стойност 0, към резултата от последното преместване се добавя -1. Това закръгляване може да се направи чрез добавяне на единица към директния код, съответстващ на резултата от последното изместване на оригиналния обратен код.
В разглеждания пример не е необходимо да се коригира резултатът от четвъртата смяна с единица, тъй като „изтласканият“ бит при последната (четвърта) смяна е равен на единица. В този случай крайният резултат от преместването на даденото отрицателно число, представено в обратния код, е 11.11111100.
При аритметично ляво изместване на отрицателно двоично число, представено вдопълнителен код, се извършва логическо ляво изместване на модула на изходния код (вакантният бит се запълва с нула) с контрол на препълване, например, ляво изместване на отрицателното двоично число 11.11001110 (5010), представено в допълващия код на двете, води до 11.10011100 (10010).
При аритметично изместване вдясно на отрицателно двоично число, представено в допълнителен код, се извършва логическо изместване вдясно на модула за запис на число със задаване на единица на освободения бит. В този случай може да се извърши контрол върху нулирането на резултата от смяната (появата на единични стойности във всички цифри).
Преместете четири бита надясно към числото на допълнението на двата 11.11001110 (десетичния еквивалент на 5010).
Първата промяна дава 11.11001110à 11.11100111(2510),
Второто изместване дава 11.11100111à 11.11110011(1310),
Третата промяна дава 11.11110011à 11.11111001(710),
Четвъртата промяна дава 11.11111001à 11.11111100(410).
При извършване на изместване надясно на нечетно цяло число, резултатът се получава до най-малката цифра на кода, като грешката е положителна.
Аритметичното изместване надясно може да се извърши върху отрицателни числа с преливане (такива числа в модифицирания пряк, обратен или допълнителен код имат 10 в полето за знак). В този случай след преместването знаковото поле ще бъде 11, а най-значимата цифра ще бъде 0, ако числото е представено в обратен код или допълнителен код на две, или 1, ако числото е представено в директен код.
Преместете надясно с 2 цифри число [A]pk = 10. 01000110 (A10 = -326).
1-ва смяна: 10.01000110 à11.10100011 (-163);
2-ро преместване: 11.10100011à11.01010001 (- 8110 и последният изтласкан бит е 1).
Финалрезултатът, като се вземе предвид закръглянето, имаме [А 2 2 ]pc=11.10010010.
Преместване надясно с 2 цифри числото [А]ок= 10. 10111001 (А10=-326).
1-ва смяна: 10.10111001 à11.01011100 (-163);
2-ра смяна: 11.01011100 €11. 10101110 (-8210).
Преместване надясно с 2 цифри числото [А]ок= 10. 10111010 (А10=-326).
1-ва смяна: 10.10111010 à11.01011101 (-163);
2-ра смяна: 11.01011101 à11. 10101110 (- 81 и последният изтласкан бит е 1).
Крайният резултат, като се вземе предвид закръгляването, имаме [А 2 2 ]ok=