Битвисе Оператионс у ВБ.НЕТ

ВБ.НЕТ не подржава директно операције на нивоу бита. Фрамеворк 1.1 (ВБ.НЕТ 2003) увео је операторе померања бита (<< и >>), али не постоји општи начин манипулације појединачним битовима. Битне операције моћи буди веома користан. На пример, ваш програм ће можда морати да се повеже са другим системом који захтева манипулацију битима. Али поред тога, постоји пуно трикова који се могу урадити помоћу појединачних битова. У овом чланку истражује се шта се може урадити помоћу манипулације битом помоћу ВБ.НЕТ-а.

Морате схватити битни оператори пре било чега другог. У ВБ.НЕТ-у то су:

  • И
  • Или
  • Ксор
  • Не

Битвисе једноставно значе да се операције могу изводити на два бинарна броја, битовима. Мицрософт користи табеле истине за документовање битних операција. Табела истине за И је:

1. битни 2. битни резултат
1 1 1
1 0 0
0 1 0
0 0 0

У мојој школи су предавали Карнаугх мапе. Карнаугх-ова карта за све четири операције приказана је на слици испод.


Кликните овде да прикажете илустрацију
Кликните на дугме Назад у прегледачу да бисте се вратили

instagram viewer

Ево једноставног примера помоћу И рад са два, четири битна бинарна броја:

Резултат 1100 И 1010 је 1000.

То је зато што 1 И 1 је 1 (први залогај), а остатак 0.

За почетак, погледајмо битне операције које то чине су директно подржано у ВБ.НЕТ: мало пребацивање. Иако су доступни и смјена улијево и удесно, они раде на исти начин, па ће се разматрати само помак лијево. Помицање бита најчешће се користи у криптографији, обради слике и комуникацији.

Операције помака ВБ.НЕТ-а помаке ...

  • Радите само са четири врсте целих бројева: Бајт, Кратак, Интегер, и Дуго
  • Аре аритметика операције смене. То значи да се битови помакнути крај краја резултата бацају, а позиције бита отворене на другом крају постављају на нулу. Алтернатива се назива кружно помакање бита, а битови помакнути један крај једноставно се додају другом. ВБ.НЕТ не подржава директно кружно померање бита. Ако вам треба, мораћете да га шифрирате на старомодни начин: множење или дељење са 2.
  • Никада не стварајте изузетак преливања. ВБ.НЕТ се брине за све могуће проблеме и показаћу вам шта то значи. Као што је напоменуто, сопствено помакање бода можете кодирати множењем или дељењем са 2, али ако користите „кодирајте свој приступ“, морате да тестирате изузеће који су преоптерећени и који могу да изазову ваш програм пад.

Стандардна операција померања бита изгледала би овако:

Дим СтартингВалуе као цео број = 14913080
Дим ВалуеАфтерСхифтинг као цео број
ВалуеАфтерСхифтинг = СтартингВалуе << 50

Ријечима, ова операција узима бинарну вриједност 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 је еквивалентна децимална вредност - приметите да је то само серија од 3 0 и 3 1 која се понавља неколико пута) и померите је за 50 места. Али пошто је Интегер дугачак само 32 бита, његово померање на 50 места је бесмислено. ВБ.НЕТ решује овај проблем маскирање бројање помака са стандардном вриједношћу која одговара врсти података који се користи. У овом случају, ВалуеАфтерСхифтинг је Интегер па је максимум који се може померати 32 бита. Стандардна вриједност маске која дјелује је 31 децимални број или 11111.

Маскирање значи да је вредност, у овом случају 50, Иед са маском. Ово даје максимални број битова који се заправо може померити за ту врсту података.

У децималном облику:

50 и 31 је 18 - Максимални број битова који се могу померати

Заправо има више смисла у бинарном облику. Битови високог реда који се не могу користити за операцију пребацивања једноставно се уклањају.

110010 и 11111 је 10010

Када се изврши исјечак кода, резултат је 954204160 или, у бинарном облику, 0011 1000 1110 0000 0000 0000 0000 0000. 18 бита на левој страни првог бинарног броја је помакнуто, а 14 бита на десној страни помјерено лијево.

Други велики проблем са померањем битова је шта се дешава када је број места за промену негативан број. Користимо -50 као број битова за помицање и да видимо шта се дешава.

ВалуеАфтерСхифтинг = СтартингВалуе << -50

Када се изврши овај исјечак кода, добивамо -477233152 или 1110 0011 1000 1110 0000 0000 0000 0000 у бинарном облику. Број је помјерен са преосталих 14 мјеста. Зашто 14? ВБ.НЕТ претпоставља да је број места непотписан цео број и да има И рад са истом маском (31 за Интегерс).

1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(И)
0000 0000 0000 0000 0000 0000 0000 1110

1110 у бинарном знаку је 14 децималних места. Примјетите да је ово обрнуто померање позитивних 50 места.

На следећој страници прелазимо на неке друге битне операције, почевши од Ксор Енцриптион!

Споменуо сам да је једна употреба битних операција шифрирање. Ксор енкрипција је популаран и једноставан начин за "шифровање" датотеке. У свом чланку, Врло једноставно шифрирање помоћу ВБ.НЕТ-а, приказујем вам бољи начин употребе стринг манипулације. Али Ксор шифрирање је толико уобичајено да заслужује да буде барем објашњено.

Шифрирање текстуалног низа значи превођење у други текстуални низ који нема очигледан однос према првом. Такође вам треба и начин да га дешифрујете поново. Ксор енкрипција преводи бинарни АСЦИИ код за сваки знак у низу у други знак користећи операцију Ксор. Да бисте обавили овај превод, потребан вам је други број који ћете користити у Ксор-у. Овај други број назива се кључем.

Ксор шифрирање се назива „симетрични алгоритам“. То значи да и кључ за шифровање можемо да користимо.

Користимо „А“ као кључ и шифрујмо реч „Басиц“. АСЦИИ код за „А“ је:

0100 0001 (децимални број 65)

АСЦИИ код за Басиц је:

Б - 0100 0010
а - 0110 0001
с - 0111 0011
и - 0110 1001
ц - 0110 0011

Тхе Ксор од сваког од њих је:

0000 0011 - децимални број 3
0010 0000 - децимална 32
0011 0010 - децимална 50
0010 1000 - децимални 40
0010 0010 - децимална 34

Ова мала рутина чини трик:

- Ксор шифрирање -
Дим и као кратак
РесултСтринг. Тект = ""
Дим КеиЦхар као цео број
КеиЦхар = Асц (ЕнцриптионКеи). Текст)
За и = 1 до Лен (ИнпутСтринг Текст)
РесултСтринг. Тект & = _
Цхр (КеиЦхар Ксор _
Асц (средина (ИнпутСтринг) Текст, и, 1)))
Следећи

Резултат се види на овој илустрацији:


Кликните овде да прикажете илустрацију
Кликните на дугме Назад у прегледачу да бисте се вратили

Да бисте поништили шифровање, само копирајте и залепите низ из Ресулт ТектБок-а назад у Стринг ТектБок и поново кликните на дугме.

Други пример нечега што можете урадити с битним операторима је заменити два цела броја без декларирања треће променљиве за привремено складиштење. То је врста ствари коју су некада радили у програмима за монтажу на језику. Сада није превише корисно, али једног дана можете добити опкладу ако можете наћи некога ко не верује да то можете учинити. У сваком случају, ако још увек имате питања како Ксор радови, радећи кроз ово требало би их одмарати. Ево код:

Дим први, као цео број
Дим СецондИнт као интегритет
ФирстИнт = ЦИнт (ФирстИнтБок). Текст)
СецондИнт = ЦИнт (СецондИнтБок. Текст)
ФирстИнт = ФирстИнт Ксор СецондИнт
СецондИнт = ФирстИнт Ксор СецондИнт
ФирстИнт = ФирстИнт Ксор СецондИнт
РесултБок. Тект = "Први цео број:" & _
ФирстИнт. ТоСтринг & "-" & _
"Други цели број:" & _
СецондИнт. ТоСтринг

А ево и кода на делу:


Кликните овде да прикажете илустрацију
Кликните на дугме Назад у прегледачу да бисте се вратили

Схватање тачно зашто ово делује остаће као "вежба за ученика".

На следећој страници стижемо до циља: Генерал Бит Манипулација

Иако су ови трикови забавни и поучни, још увек нису замена за општу манипулацију битима. Ако се заиста спустите на ниво битова, оно што желите је начин да прегледате појединачне битове, подесите их или промените. То је прави код који недостаје .НЕТ.

Можда је разлог што то недостаје тај што није тако тешко написати подпрограме који остварују исту ствар.

Типичан разлог због којег бисте то можда желели је да задржите оно што се понекад назива а флаг бите. Неке апликације, посебно оне написане на језицима ниског нивоа, као што је монтер, одржават ће осам логичких застава у једном бајту. На пример, регистар статуса чипа 6502 чипа садржи ове информације у једном 8-битном бајту:

Бит 7. Негативна застава
Бит 6. Оверфлов флаг
Бит 5 Некоришћен
Бит 4 Бреак застава
Бит 3. Децимална застава
Бит 2. Прекида-онемогући заставу
Бит 1. Нула застава
Бит 0. Носите заставу

(из Википедије)

Ако ваш код мора да ради са овом врстом података, потребан вам је код за манипулацију битима опште намене. Овај код ће урадити посао!

'ЦлеарБит Суб брише први, н-ти бит
'(МиБит) целог броја (МиБите).
Суб ЦлеарБит (БиРеф МиБите, БиВал МиБит)
Дим БитМаск као Инт16
'Направите битмаску са сетом од 2 до нб снаге:
БитМаск = 2 ^ (МиБит - 1)
'Очистите нити бит:
МиБите = МиБите а не БитМаск
Енд Суб
'Функција ЕкаминеБит ће вратити Труе или Фалсе
'зависно од вриједности 1-тог, н-битног (МиБит)
'целог броја (МиБите).
Функција ЕкаминеБит (БиВал МиБите, БиВал МиБит) Као Боолеан
Дим БитМаск као Инт16
БитМаск = 2 ^ (МиБит - 1)
ЕкаминеБит = ((МиБите и БитМаск)> 0)
Завршна функција
'СетБит Суб ће поставити 1-ти, битни
'(МиБит) целог броја (МиБите).
Под СетБит (БиРеф МиБите, БиВал МиБит)
Дим БитМаск као Инт16
БитМаск = 2 ^ (МиБит - 1)
МиБите = МиБите Или БитМаск
Енд Суб
'ТогглеБит Суб ће променити стање
'од 1 базиран, н-ти бит (МиБит)
'целог броја (МиБите).
Суб ТогглеБит (БиРеф МиБите, БиВал МиБит)
Дим БитМаск као Инт16
БитМаск = 2 ^ (МиБит - 1)
МиБите = МиБите Ксор БитМаск
Енд Суб

Да би демонстрирао код, ова рутина га позива (параметри нису кодирани у Цлицк Суб):

Приватни Суб ЕкБитЦоде_Цлицк (...
Дим Бите1, Бите2 Ас Бите
Дим МиБите, МиБит
Дим СтатусОфБит Ас Боолеан
Дим СелецтедРБ као стринг
СтатусЛине Тект = ""
ИзабраноРБ = ГетЦхецкедРадиоБуттон (Ме) .Наме
Бите1 = БитеНум. Текст 'Број за претварање у битне заставе
Бите2 = БитНум. Текст Бит треба пребацити
'Следеће брише бајт високог реда и враћа само
'бајт ниског реда:
МиБите = Бите1 И & ХФФ
МиБит = Бите2
Изаберите Цасе СелецтедРБ
Футрола "ЦлеарБитБуттон"
ЦлеарБит (МиБите, МиБит)
СтатусЛине Тект = "Нови бајт:" & МиБите
Случај "ЕкаминеБитБуттон"
СтатусОфБит = ЕкаминеБит (МиБите, МиБит)
СтатусЛине Тект = "Бит" и МиБит & _
"је" & СтатусОфБит
Футрола "СетБитБуттон"
СетБит (МиБите, МиБит)
СтатусЛине Тект = "Нови бајт:" & МиБите
Футрола "ТогглеБитБуттон"
ТогглеБит (МиБите, МиБит)
СтатусЛине Тект = "Нови бајт:" & МиБите
Енд Селецт
Енд Суб
Приватна функција ГетЦхецкедРадиоБуттон (_
БиВал родитељ као контрола) _
Као РадиоБуттон
Дим ФормЦонтрол као контрола
Дим РБ као РадиоБуттон
За сваки ФормЦонтрол у родитељу. Контроле
Ако ФормЦонтрол. ГетТипе () је ГетТипе (РадиоБуттон) затим
РБ = ДирецтЦаст (ФормЦонтрол, РадиоБуттон)
Ако је РБ.проверено, вратите РБ
Енд Иф
Следећи
Врати ништа
Завршна функција

Код на делу изгледа овако:


Кликните овде да прикажете илустрацију
Кликните на дугме Назад у прегледачу да бисте се вратили

instagram story viewer