Maison  >  Article  >  Java  >  Analyse d'un exemple de code d'opération de bits Java

Analyse d'un exemple de code d'opération de bits Java

王林
王林avant
2023-04-23 13:52:071116parcourir

Opérations au niveau des bits

J'ai appris les opérations au niveau des bits il y a longtemps, mais je ne les ai pas utilisées depuis si longtemps que j'ai l'impression de les avoir presque oubliées. J'ai récemment regardé quelques codes d'arithmétique et j'ai découvert que je ne pouvais pas tous les comprendre, haha. Il est temps de revenir et de rattraper les bases.

Tous les nombres du programme sont stockés sous forme binaire dans la mémoire de l'ordinateur. Les opérations sur les bits doivent opérer directement sur les bits binaires des entiers en mémoire.

Opérateurs pour les opérations au niveau du bit :

Décalage à droite non signé
Opérateur signifiant
& ET au niveau du bit
| OR au niveau du bit
~ petit à petit Négation
^ bitwise t;>

Ce sont des connaissances très basiques, mais si vous ne les utilisez pas trop longtemps, vous les oublierez forcément. Vous pourrez les utiliser davantage en codant !

Parler ne coûte pas cher, montrez-moi le code.

Remarque : il est vraiment difficile de voir l'application lorsque l'on en discute seul. Si quelque chose n'est pas clair, vous pouvez consulter les résumés des autres.

Regardons l'application des opérations sur bits avec un code :

public final void writeInt(int v) throws IOException {
	  out.write((v >>> 24) & 0xFF);
	  out.write((v >>> 16) & 0xFF);
	  out.write((v >>>  8) & 0xFF);
	  out.write((v >>>  0) & 0xFF);
	  incCount(4);
}

Ce code est DataOutputStream 类中的一个方法,用于将一个 int 型的整数写入流中。这个方法的命名是很有意思的,它和 OutputStream 中的 public abstract void write(int b) throws IOException Cette méthode est complètement différente. Les paramètres de cette méthode semblent indiquer qu'elle peut écrire un entier dans le flux, mais la fonction de la méthode n'est pas devinée, mais dépend de la description de la méthode. Introduction dans

public abstract void write(int b) throws IOException

API :

Écrit l'octet spécifié dans ce flux de sortie. Le contrat général pour write est qu'un octet est écrit dans le flux de sortie. L'octet à écrire est constitué des huit bits de poids faible de. l'argument b. Les 24 bits de poids fort de b sont ignorés.

Il écrit un octet spécifique dans le flux. Nous savons qu'une variable int occupe 32 bits et qu'un octet occupe 8 bits, donc le dernier. 8 bits d'un entier de type int inférieur à 256 (2 ^ 8) et un entier de type octet sont identiques.

Cette méthode consiste donc à écrire les 8 bits les plus bas d'une variable int et à ignorer les 24 bits restants. Soyez très prudent lorsque vous utilisez cette méthode !

L'octet à écrire est les huit bits de poids faible de l'argument b. Les 24 bits de poids fort de b sont ignorés.

Donc, écrivez complètement une variable int dans le flux. n'est pas un problème très simple. Revenons au code ci-dessus : il est écrit quatre fois de suite, en écrivant à chaque fois un octet de données. De cette façon, une variable de type int est transformée en 4 octets et écrite dans le flux.

out.write((v >>> 24) & 0xFF); Cette méthode consiste à écrire le nombre inférieur à 8 chiffres ci-dessus. Cette implémentation spécifique est fournie par la sous-classe correspondante.

Regardons le schéma : Une opération ET simple : On peut voir que le résultat de l'opération conserve les 8 bits inférieurs. C'est le résultat du (v>>>24) & 0xFF. opération.

Analyse dun exemple de code dopération de bits Java

Alors, comment obtenir la valeur élevée de 8 bits ? Cela nécessite l'utilisation d'opérations de décalage :

Analyse dun exemple de code dopération de bits Java

En effectuant l'opération de décalage, vous pouvez obtenir toutes les données de 8 bits, puis effectuer l'opération AND & au niveau du bit pour écrire complètement un entier dans le flux.

Démonstration de code

Code
package dragon;

/**
 * 分析这一个方法,目前水平有限,先从最简单的做起!
 * */

//		   public final void writeInt(int v) throws IOException {
//        out.write((v >>> 24) & 0xFF);
//        out.write((v >>> 16) & 0xFF);
//        out.write((v >>>  8) & 0xFF);
//        out.write((v >>>  0) & 0xFF);
//        incCount(4);
//    }


//上面这段代码是将一个32位整型,写入输出流。
//并且是将32位整型分为4个部分,每次写入8位。
//这是Java的特性。


public class DataOutputStreamAnalysis {
	public static void main(String[] args) {
		DataOutputStreamAnalysis analysis = new DataOutputStreamAnalysis();
		analysis.analysis(65535);
	}
	
	public void analysis(int number) {
		int number1, number2, number3, number4;  //后面的数字表示是一个32位整型的第几个8位。
		number1 = (number >>> 24) & 0xFF;    
		number2 = (number >>> 16) & 0xFF;    
		number3 = (number >>> 8) & 0xFF;
		number4 = (number >>> 0) & 0xFF;
		
		
		
		System.out.println(this.format(Integer.toBinaryString(number))+"  原始数据"); 
		System.out.println(this.format(Integer.toBinaryString(number1))+"  原始数据第一个8位");
		System.out.println(this.format(Integer.toBinaryString(number2))+"  原始数据第二个8位");
		System.out.println(this.format(Integer.toBinaryString(number3))+"  原始数据第三个8位");
		System.out.println(this.format(Integer.toBinaryString(number4))+"  原始数据第四个8位");
	}
	
	/**
	 * 输入一个二进制字符串,将其格式化,因为整型是
	 * 占32位的,但是转换成的二进制字符串,并没有32位*/
	public String format(String bstr) {
		int len = bstr.length();
		StringBuilder sb = new StringBuilder(35);
		for (int i = 0; i < 32-len; i++) {
			sb.append("0");
		}
		sb.append(bstr);
		sb.insert(8, " ");
		sb.insert(17, " ");
		sb.insert(26, " ");   //前面插入一个字符后,所有字符的索引都变了!
		return sb.toString();
	}
}
Résultat

Analyse dun exemple de code dopération de bits Java

Explication : Le cas des nombres négatifs n'est pas considéré ici, mais ils sont tous pareils, sauf que l'expression des nombres négatifs est un peu plus gênante. Tant que vous comprenez les nombres positifs, les nombres négatifs ne posent pas de problème.

Application des opérations sur les bits

1. Déterminez si la variable de type int

if (x & 1 ==0) 
	System.out.println("x是偶数");
if (x & 1 == 1) 
    System.out.println("x是奇数");

Explication : C'est quand même facile à comprendre, car le décalage final des nombres pairs doit être 0. (Représentation binaire)

2. Prenez le k-ème bit de la variable de type int.

Expression : x >> k & 1 (Il est recommandé d'ajouter des parenthèses pour le rendre plus clair.)

3. Définissez la k-ième position de la variable de type int x sur 1 Décalez 1 sur. la gauche par k bits, puis effectuez une opération OU logique avec la variable x, puis le k-ième bit de la variable x est mis à 1 et les autres bits restent inchangés.

Expression : x = x | (1

4. Effacez le k-ième bit de la variable de type int à 0 Décalez 1 vers la gauche de k bits, inversez les résultats, et additionner les résultats. Si une opération logique est effectuée sous la variable, le k-ème bit de la variable x sera remis à 0 et les autres bits resteront inchangés.

Bits d'expression : x = x & ~(1

5. Calculez la moyenne de deux entiers

Bits d'expression : (x & y) + ((x ^ y) > Formule : x = x

Par exemple : Développez x de 2 fois : x = x

La raison pour laquelle les opérations au niveau du bit sont recommandées :

Les opérations au niveau du bit sont plus rapides que les opérations arithmétiques, car les opérations au niveau du bit nécessitent moins d'instructions et nécessitent moins de temps d'exécution. Elles semblent très rapides, mais les avantages des opérations au niveau du bit ne peuvent être constatés que lorsqu'un grand nombre d'exécutions sont effectuées. Après tout, les ordinateurs d’aujourd’hui sont de plus en plus rapides.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer