web-dev-qa-db-fra.com

Comment définir / non défini un peu à une position spécifique d'une longue?

Comment définir/non défini un peu à la position spécifique d'un long in Java?

Par exemple,

long l = 0b001100L ; // bit representation

Je veux mettre un bit à la position 2 et le bit non défini à la position 3 ainsi correspondant longtemps sera,

long l = 0b001010L ; // bit representation

Quelqu'un peut-il m'aider à faire ça?

25
Arpssss

Pour définir un peu, utilisez:

x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB

pour effacer un bit d'utilisation:

x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB

pour basculer un peu utiliser:

x ^= 0b1;

Remarquez que j'utilise 0B ?. Vous pouvez également utiliser n'importe quel entier, par exemple:

x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit

Cependant, cela rend plus difficile de savoir quel bit est changé.

Utilisation du binaire vous permet de voir quels bits exacts seront définis/effacés/basculés.

Pour régler dynamiquement un peu, utilisez:

x |= (1 << y); // set the yth bit from the LSB

(1 << y) Déplace la ... 001 y des endroits où il reste, de sorte que vous puissiez déplacer les bits de jeu.

Vous pouvez également définir plusieurs bits à la fois:

x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB

Ou à non défini:

x &= ~((1 << y) | (1 << z)); // unset yth and zth bit

Ou pour basculer:

x ^= (1 << y) | (1 << z); // toggle yth and zth bit
70
ronalchn

Le bit le moins significatif (LSB) est généralement appelé bit 0, votre "position 2" est donc vraiment "bit 1".

long x = 0b001100;  // x now = 0b001100
x |= (1<<1);        // x now = 0b001110 (bit 1 set)
x &= ~(1<<2);       // x now = 0b001010 (bit 2 cleared)
7
push2eject

Je choisirais Biginteger pour cela ...

class Test {
    public static void main(String[] args) throws Exception {
        Long value = 12L;
        BigInteger b = new BigInteger(String.valueOf(value));
        System.out.println(b.toString(2) + " " + value);
        b = b.setBit(1);
        b = b.clearBit(2);
        value = Long.valueOf(b.toString());
        System.out.println(b.toString(2) + " " + value);
    }
}

et voici la sortie:

1100 12
1010 10
3
Bharat Sinha