J'essaie de comprendre une partie de ce code qui a été créé ici pour créer un my_hashset: https://leetcode.com/problems/ design-hashset / discuter / 548792 / Java-solution-rapid-than-99

   class HashCode_from_leet {
    int[] bitArr;
    private static final int MAX = 100000;
    private static final int INT_SIZE = Integer.SIZE;

    public HashCode_from_leet() {
        bitArr = new int[MAX / INT_SIZE + 1];
    }

    public void add(int key) {  //pass in 5
        int ind = key / INT_SIZE;  
        int bit = key % INT_SIZE;
        int bitMask = 1 << bit;  //QUESTION: why does bitMask = 32?
        bitArr[ind] |= bitMask;  // QUESTION: what does '|=' mean?
    }

    // NOTE I REMOVED SOME METHODS 

    public boolean contains(int key) {
        int ind = key / INT_SIZE;
        int bit = key % INT_SIZE;
        int bitMask = 1 << bit;
        return (bitArr[ind] & bitMask) != 0;
    }


    public static void main(String[] args) {
        HashCode_from_leet hfl = new HashCode_from_leet();
        hfl.add(5);
        System.out.println(hfl.contains(5));
    }
}

Quand je passe 5 dans la méthode add(int key) bitMask = 32

Je ne sais pas pourquoi - je comprends que << signifie décalage à gauche, donc nous prenons 5 et le décalage à gauche, mais penserions-nous que cela équivaut à 5 * 10 ^ 2? Quelqu'un pourrait-il m'aider à comprendre cela?

Je vous remercie

0
Katie Melosto 12 avril 2020 à 16:11

3 réponses

Meilleure réponse

Lorsque vous shift left un entier de X, par exemple: Z =(Y << X), il effectuera cette opération: Z = (Y * (2^X))

Lorsque vous shift right un entier de X, par exemple: Z =(Y >> X), il effectuera cette opération: Z = (Y / (2^X))

2
Elarbi Mohamed Aymen 12 avril 2020 à 13:18

que se passe-t-il lorsque vous déplacez un int vers la gauche

Comme son nom l'indique, décaler un nombre de n vers la gauche, le multiplie par 2^n. Le code suivant vous aidera à mieux le comprendre.

public class Main {
    public static void main(String[] args) {
        int x = 5;
        System.out.println("In decimal: " + x + ", In Binary: "
                + "0000000000000000".substring(Integer.toBinaryString(x).length()) + Integer.toBinaryString(x));
        int y = x << 1;
        System.out.println("In decimal: " + y + ", In Binary: "
                + "0000000000000000".substring(Integer.toBinaryString(y).length()) + Integer.toBinaryString(y));
        int z = x << 2;
        System.out.println("In decimal: " + z + ", In Binary: "
                + "0000000000000000".substring(Integer.toBinaryString(z).length()) + Integer.toBinaryString(z));
    }
}

Sortie:

In decimal: 5, In Binary: 0000000000000101
In decimal: 10, In Binary: 0000000000001010
In decimal: 20, In Binary: 0000000000010100

N'hésitez pas à commenter en cas de doute supplémentaire.

1
Arvind Kumar Avinash 12 avril 2020 à 13:23

Ligne de notification int bit = key % INT_SIZE; // which is 5 % 32 according to your code

Maintenant bit = 5 // because 5 % 32 = 5

Maintenant int bitMask = 1 << bit; // you're saying shit 1 to five bits to left

in 32 bits 1 = 000000000000000000000000000000000001

Après avoir chié 5 bits à gauche, il devient

000000000000000000000000000000000100000 = 32 //in binary that is why bitmask continas 32

Parlons maintenant de l'opérateur |=

| est un opérateur OR au niveau du bit que vous utilisez simplement comme affectation composée

bitArr[ind] |= bitMask is similar to bitArr[ind] = bitArr[ind] | bitmask

Par exemple, dites bitArr[ind] equals 5 and bitmask equals 3

Maintenant bitArr[ind] | bitmask signifie 5 | 3

Il fera OU au niveau du bit avec une représentation binaire

Signifie 101 | 011 qui devient 111 qui est 7

1
Abhinav Chauhan 12 avril 2020 à 13:41