[PYTHON] Bitmaske

Python - Anfangsversion

bitmask.py


# b5-Holen Sie sich eine b3-Maske. 
startbit=3   #Startbit b3
bitlen=3     #Bitlänge von 3 Bit einschließlich Startbit(b5b4b3)
b=0
for i in range(startbit, startbit + bitlen):
     b|=1<<i

bin(b) #=> '0b111000'

# b10-Holen Sie sich eine Maske von b0. 
startbit=0 #Startbit b0
bitlen=11 #11bit Bitlänge inklusive Startbit(b10...b1b0)
b=0
for i in range(startbit, startbit + bitlen):
    b|=1<<i

bin(b) # '0b11111111111'

# b49-Holen Sie sich 45 Masken.
startbit=45 #Startbit b45
bitlen=5 #5-Bit-Bitlänge einschließlich Startbit(b49b48b47b46b45)
b=0
for i in range(startbit, startbit + bitlen):
    b|=1<<i

bin(b) #=> '0b11111000000000000000000000000000000000000000000000'

Python - Shiracamus Version

bitmask.py


def bitmask(startbit, bitlen):
     return ((1 << bitlen) - 1) << startbit

Wenn Sie es mit startbit = 3 und bitlen = 3 verkörpern, können Sie sehen, dass die Maske mit einem komplementären Gefühl benötigt wird. 1 << bitlen :  1 <<3 = 0b1000

(1 << bitlen) - 1 :  (1 << 3) - 1 = 0b1000 - 1 = 0b111

(1 << bitlen) - 1) << starbit :  ((1 << 3) - 1) << 3 = 0b111 << 3 = 0b111000

C-Erstversion

http://melpon.org/wandbox/permlink/KAdTUEdphWrNncP0

bitmask.c


#include <stdio.h>
unsigned long long bitmask1(
    unsigned char startbit,
    unsigned char bitlen
){
    return (((unsigned long long)0x1 << bitlen)-0x1) << startbit;
}

C-Shiracamus-Version

bitmask2.c


unsigned long long bitmask2(
    unsigned char startbit,
    unsigned char bitlen
){
    if (startbit >= 64) return 0;
    if (bitlen >= 64) return ~0ULL << startbit;
    return ((1ULL << bitlen) - 1ULL) << startbit;
}

C-Dritte Ausgabe

Infolge verschiedener Gedanken wurde es weniger interessant.

Vergleich der Ausführungsergebnisse http://melpon.org/wandbox/permlink/hTrTCCmfgjORuGsT

bitmask3.c


 unsigned long long bitmask3(
    unsigned char startbit,
    unsigned char bitlen
){
    unsigned long long bm = 0x0UL;
    if (bitlen == 64u){
        bm = ~(0x0ULL);
    } else {
        bitlen %= 64u;
        bm = (0x1ULL << bitlen) - 0x1ULL ;
    }
    startbit %= 64u;
    bm <<= startbit;
    
    return bm ;
}

Recommended Posts

Bitmaske
Bitoperation
Logische Operation / Bitoperation 0
PYTHON2.7 64-Bit-Version