简体   繁体   中英

How to split an unsigned long int (32 bit) into 8 nibbles?

I am sorry if my question is confusing but here is the example of what I want to do,

lets say I have an unsigned long int = 1265985549 in binary I can write this as 01001011011101010110100000001101

now I want to split this binary 32 bit number into 4 bits like this and work separately on those 4 bits

0100 1011 0111 0101 0110 1000 0000 1101

any help would be appreciated.

You can get a 4-bit nibble at position k using bit operations, like this:

uint32_t nibble(uint32_t val, int k) {
    return (val >> (4*k)) & 0x0F;
}

Now you can get the individual nibbles in a loop, like this:

uint32_t val = 1265985549;
for (int k = 0; k != 8 ; k++) {
    uint32_t n = nibble(val, k);
    cout << n << endl;
}

Demo on ideone.

short nibble0 = (i >>  0) & 15;
short nibble1 = (i >>  4) & 15;
short nibble2 = (i >>  8) & 15;
short nibble3 = (i >> 12) & 15;

etc

Based on the comment explaining the actual use for this, here's an other way to count how many nibbles have an odd parity: (not tested)

; compute parities of nibbles
x ^= x >> 2;
x ^= x >> 1;
x &= 0x11111111;
; add the parities
x = (x + (x >> 4)) & 0x0F0F0F0F;
int count = x * 0x01010101 >> 24;

The first part is just a regular "xor all the bits" type of parity calculation (where "all bits" refers to all the bits in a nibble, not in the entire integer), the second part is based on this bitcount algorithm , skipping some steps that are unnecessary because certain bits are always zero and so don't have to be added.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM