Extraheren van bits met bitsgewijze operatoren

Ik probeer te leren hoe ik bitwise operatoren gebruik op een gegeven invoer, maar heb niet veel geluk om uit te zoeken hoe ik ze moet gebruiken.

Laten we zeggen dat ik dit volgende octet heb:

11(01)0000

Hoe zou ik de bits tussen de accolades uittrekken?

0
Ik heb dit maanden geleden gemerkt en heb de smackdown gekregen. Blij dat we het huiswerk van mensen niet doen.
toegevoegd de auteur one.beat.consumer, de bron
@Bart, ik begrijp je punt, ik weet dat je niet neerbuigend bent, maar het punt is dat ik 5 dagen heb om een ​​virtuele machine te coderen, een assembler en een goede kampioen voor een koninklijke familie, en ik schaam me heel erg om het toe te geven, maar Ik had een kant-en-klaar antwoord nodig om door te gaan, ik kan me geen half uur veroorloven, ik besef dat de vraag nogal zwak was, ik zal het de volgende keer beter doen!
toegevoegd de auteur Mathieu_Du, de bron
"Ik wist niet wat operators moesten gebruiken". Neem pen en papier en noteer kleine voorbeelden van enen en nullen. Nu kunt u met elke documentatie die u kunt gebruiken, nagaan wat elke operator doet met uw kleine (paar) voorbeelden. Je zult snel de bouwstenen realiseren die je hebt om je probleem op te lossen. Dit niet zeggen om neerbuigend te zijn, maar je zult jezelf later bedanken voor het doen.
toegevoegd de auteur Bart, de bron

2 antwoord

Je moet:

  1. create a suitable mask with ones only where are the bytes you need (you just need to write the number in binary and convert to e.g. hex to put it inside the C program). The parentheses in your 11(01)0000 are your indication to where to put the ones in your mask.

    Alternatively, create a mask made of as many ones as the chunk of bits you are interested in (in your case two ones, i.e. 11 in binary, i.e. 3 in decimal) and left shift it to move it to the position where you need it (left shift operator: <<). This approach can be useful if the position of your "bit window" is known only at runtime.

  2. Perform a bitwise-and operation between your number and the mask (the bitwise and operator is &).

    The bitwise and only leaves as 1 the bits that are 1 in both the operands, so the effect is "filtering" the source number with the bits of the mask: only the bits that correspond to ones in the mask are let "flow through" it, all the other bits are left as zero.

  3. Now you have extracted the bits of your interest, but they are still in their original position inside the number. If you want/need it, you can then right shift them to "align them to the right" (use the right shift operator: >>).

6
toegevoegd
Versla me eraan. En meteen met # 3 ... dat was ook een goede opfriscursus voor mij.
toegevoegd de auteur one.beat.consumer, de bron
Heel erg bedankt voor dit gedetailleerde antwoord :)
toegevoegd de auteur Mathieu_Du, de bron

Masker uw waarde met de bits die u wilt selecteren en verschuif.

Als uw 11010000-nummer x is, is het gewenste twee bitnummer dat

(x & 0x30 ) >> 4
1
toegevoegd
Aye. Dat is de reden waarom mijn antwoord hieronder probeerde om de operanden uit te leggen en waar om hem te leiden, geen enkele regel code te geven :)
toegevoegd de auteur one.beat.consumer, de bron
Het gebruikelijke beleid met vragen die zijn getagd als huiswerk, is niet om kant-en-klare antwoorden te geven ...
toegevoegd de auteur Matteo Italia, de bron