Με τους τελεστές bitwise της Java, μπορείτε να χειριστείτε μεμονωμένα bit με όποιον τρόπο επιθυμείτε. Οι επτά τελεστές έχουν παρόμοια δομή και ακολουθούν σταθερούς κανόνες που είναι εύκολο να μάθετε.

Τι είναι οι τελεστές bitwise και σε τι χρησιμοποιούνται;

Οι τελεστές Java είναι ένα σημαντικό εργαλείο κατά την εργασία με τη γλώσσα προγραμματισμού. Εκτός από τις πολλές άλλες δυνατότητες και λειτουργίες, σας δίνουν τη δυνατότητα να χειρίζεστε τις μικρότερες δυνατές μονάδες πληροφοριών: τα bit. Τα bits (δυαδικά ψηφία) έχουν το δικό τους αριθμητικό σύστημα που βασίζεται στις τιμές 0 και 1. Αν θέλετε να αναζητήσετε δυαδικές τιμές bit προς bit, χρειάζεστε έναν τελεστή bitwise στη Java. Μπορείτε να το εφαρμόσετε στους αριθμητικούς τύπους δεδομένων (byte, char, int, short, long).

Αν και δεν θα χρειαστείτε τη λειτουργία σε καθημερινή βάση, μπορεί να είναι χρήσιμη σε πολλές περιπτώσεις. Για παράδειγμα, μπορεί να σας φανεί χρήσιμη αν θέλετε να εξοικονομήσετε χώρο κατά τη μετατροπή δεδομένων, αν θέλετε να χρησιμοποιήσετε τον τελεστή XOR ή αν απλά θέλετε να αλλάξετε ένα bit. Αποτελούν επίσης τη βάση για όλες τις ανώτερες λειτουργίες κυκλωμάτων. Γι’ αυτό είναι σημαντικό να κατανοήσετε τη βασική λειτουργικότητα των τελεστών bitwise της Java.

Ποιοι είναι οι bitwise τελεστές της Java;

Συνολικά υπάρχουν επτά διαφορετικοί τελεστές bitwise στη Java. Για να κατανοήσουμε πλήρως το θέμα, θα ξεκινήσουμε με τους τελεστές a και b.

  • ~ (bitwise NOT, συμπλήρωμα): Αυτός ο τελεστής αντιστρέφει τα bit. Το 0 γίνεται 1 και το 1 γίνεται 0.
  • & (bitwise AND): Αυτός ο τελεστής παράγει ένα 1 αν και οι δύο τελεστές είναι 1. Διαφορετικά, παράγεται ένα 0.
  • | (bitwise OR): Αυτός ο τελεστής παράγει ένα 1 αν ένας από τους δύο τελεστές είναι επίσης 1.
  • ^ (XOR ή bitwise exclusive OR): Αυτός ο τελεστής παράγει ένα 0 αν και οι δύο τελεστές έχουν την ίδια τιμή. Διαφορετικά, παράγει ένα 1.
  • << (αριστερή μετατόπιση): Αυτός ο τελεστής μετατοπίζει τον τελεστή a προς τα αριστερά κατά b θέσεις. Εάν αυτό έχει ως αποτέλεσμα κενά, τα κενά θα γεμίσουν με 0.
  • >> (δεξιά μετατόπιση με πρόσημο, αριθμητική): Αυτός ο τελεστής μετατοπίζει όλα τα bit του a κατά b θέσεις προς τα δεξιά. Εάν το bit με την υψηλότερη τιμή είχε οριστεί πριν από την εκτέλεση, παραμένει ορισμένο και μετά. Οι αρνητικοί αριθμοί παραμένουν αρνητικοί.
  • >>>> (δεξιά μετατόπιση χωρίς πρόσημο, λογική): Αυτός ο τελεστής μετατοπίζει τα bits του a προς τα δεξιά κατά b θέσεις. Τα κενά γεμίζουν πάντα με 0.

Bitwise NOT

Ο τελεστής bitwise NOT της Java αναπαρίσταται με ένα tilde (~). Αναιρεί όλα τα bit, μετατρέποντας τα μηδενικά σε μονάδες και τις μονάδες σε μηδενικά. Ας πάρουμε, για παράδειγμα, τον αριθμό 20. Σε δυαδική μορφή, έχει την εξής μορφή: 10100. Αν εφαρμόσουμε τον τελεστή bitwise NOT, κάθε bit του αριθμού θα αλλάξει: το 10100 γίνεται 01011. Αυτή είναι η τιμή της έκφρασης ~20. Αν μετατρέψουμε αυτόν τον δυαδικό αριθμό ξανά σε δεκαδικό αριθμό, παίρνουμε την τιμή -21. Αν θέλετε να δοκιμάσετε αυτή τη διαδικασία σε Java, εισάγετε τον ακόλουθο κώδικα και την εντολή Java System.out.println για να εμφανιστεί το αποτέλεσμα.

public class Main {
	public static void main(String[] args) {
	int value1 = 20;
	System.out.println(~value1);
}
}
java

Εάν έχετε εισάγει όλα τα στοιχεία σωστά, το αποτέλεσμα θα πρέπει να είναι «-21».

Bitwise AND

Το Bitwise AND συγκρίνει δύο αριθμούς στη δυαδική τους μορφή bit προς bit. Το πρώτο bit του πρώτου αριθμού συγκρίνεται με το πρώτο bit του δεύτερου αριθμού, το δεύτερο με το δεύτερο bit και ούτω καθεξής. Εάν και τα δύο bit είναι 1, η έξοδος είναι 1. Εάν δεν ισχύει αυτό (και τα δύο bit είναι 0 ή ένα από τα bit είναι 0), η έξοδος είναι 0. Στο παρακάτω παράδειγμα, θα εξετάσουμε τους δύο δεκαδικούς αριθμούς 18 και 25. Ως δυαδικός αριθμός, το 18 είναι 10010 και το 25 σε δυαδική μορφή είναι 11001. Τώρα ας συγκρίνουμε αυτούς τους δύο αριθμούς και ας προσδιορίσουμε έναν τρίτο αριθμό από αυτούς.

18 = 10010 25 = 11001

Τα δύο πρώτα bits των αριθμών είναι και τα δύο 1, οπότε ο αριθμός που προκύπτει ξεκινά επίσης με 1. Το δεύτερο bit του 25 είναι επίσης 1, αλλά το δεύτερο bit του 18 είναι 0, οπότε το ψηφίο του τρίτου αριθμού είναι 0. Αφού εξετάσουμε και τους δύο αριθμούς bit προς bit, καταλήγουμε στον δυαδικό αριθμό 10000. Αν τον μετατρέψουμε σε δεκαδικό αριθμό, το αποτέλεσμα θα είναι 16.

Ο κώδικας έχει την εξής μορφή:

public class Main {
	public static void main(String[] args) {
	System.out.println(18&25);
}
}
java

Η έξοδος στην κονσόλα θα πρέπει να είναι 16.

Bitwise OR

Ο τελεστής bitwise OR της Java συγκρίνει επίσης δύο αριθμούς bit προς bit. Σε αυτή την περίπτωση, ωστόσο, μόνο ένας από τους δύο τελεστές πρέπει να έχει την τιμή 1 για να προκύψει το αποτέλεσμα 1. Αν πάρουμε τους αριθμούς από το προηγούμενο παράδειγμα, θα έχει την εξής μορφή:

18 = 10010 25 = 11001

Δεδομένου ότι όλα τα bits εκτός από το τρίτο ψηφίο περιέχουν τουλάχιστον ένα 1, ο αριθμός που προκύπτει είναι: 11011. Μετά τη μετατροπή, έχουμε 27.

Αυτό είναι το παράδειγμα σε κώδικα:

public class Main {
	public static void main(String[] args) {
	System.out.println(18|25);
}
}
java

XOR

Το XOR ή bitwise exclusive OR (^) είναι παρόμοιο με το bitwise OR. Με το bitwise OR, ένας ή και οι δύο τελεστές πρέπει να είναι 1 για να δώσει ως αποτέλεσμα 1. Ωστόσο, με το XOR, το 1 δίνεται ως αποτέλεσμα μόνο αν ακριβώς μία από τις δύο τιμές είναι 1. Για να κατανοήσουμε καλύτερα τον τρόπο λειτουργίας του XOR, ας δούμε ένα παράδειγμα:

18 = 10010 25 = 11001

Τα δύο πρώτα bit έχουν την τιμή 1, οπότε με αυτόν τον τελεστή bitwise στη Java, το αποτέλεσμα είναι 0. Το δεύτερο bit του 18 είναι 0, αλλά το δεύτερο bit του 25 είναι 1. Αυτό έχει ως αποτέλεσμα την τιμή 1. Αν συνεχίσουμε, παίρνουμε τον αριθμό 01011. Σε δεκαδική μορφή, αυτό είναι 11.

Εδώ είναι ο κώδικας:

public class Main {
	public static void main(String[] args) {
	System.out.println(18^25);
}
}
java

Αριστερή μετατόπιση

Η αριστερή μετατόπιση μετατοπίζει τα bits της τιμής a προς τα αριστερά κατά την απόσταση b. Τα κενά που προκύπτουν συμπληρώνονται με 0. Μια τιμή int που καταλαμβάνει 32 bits στη μνήμη το απεικονίζει αυτό με σαφήνεια. Ας πάρουμε ξανά τον αριθμό 20 ή 10010 για a και ας τον μετατοπίσουμε κατά την τιμή b 2 για να λάβουμε την τιμή c 1001000. Δύο μηδενικά τοποθετούνται στο τέλος. Το 1001000 αντιστοιχεί στην δεκαδική τιμή 72.

Ακολουθεί η απεικόνιση αυτής της διαδικασίας σε κώδικα:

public class Main {
	public static void main(String[] args) {
	int a = 20;
	int b = 2;
	int c = (a << b);
	System.out.println(c);
}
}
java

Δεξιά μετατόπιση με πρόσημο

Η μετατόπιση προς τα δεξιά λειτουργεί αντίστροφα. Εδώ, τα bits της τιμής a μετατοπίζονται προς τα δεξιά κατά την τιμή b, παράγοντας την τιμή c. Ως αποτέλεσμα, τα τελευταία bits παραλείπονται. Αν μετατοπίσουμε το 20 ή το 10010 δύο θέσεις προς τα δεξιά, το αποτέλεσμα είναι 100 ή 4.

Εδώ είναι ο κώδικας:

public class Main {
	public static void main(String[] args) {
	System.out.println(20 >> 2);
}
}
java

Είναι σημαντικό να σημειωθεί ότι αν το a είναι θετικός αριθμός, τα κενά συμπληρώνονται με 0. Αν είναι αρνητικός, τα κενά αντικαθίστανται με 1.

Δεξιά μετατόπιση χωρίς πρόσημο

Κατ’ αρχήν, ο τελεστής bitwise της Java για μετατόπιση προς τα δεξιά χωρίς πρόσημο (>>>) λειτουργεί με τον ίδιο τρόπο. Η μόνη διαφορά είναι ότι τα κενά που δημιουργούνται στην αριστερή πλευρά από τη μετατόπιση προς τα δεξιά γεμίζουν πάντα με 0. Αυτό έχει πάντα ως αποτέλεσμα έναν θετικό αριθμό, ακόμη και αν η αρχική τιμή ήταν αρνητική. 4c5f986ec517d687f98f93f0abe2fb9b

2f82e8f4ba94d81f81750e0ff92220dd

Go to Main Menu