J'ai posé des questions sur la manipulation hexagonale et bitwise (ici et ailleurs) pour la semaine passée en essayant d'envelopper ma tête autour de leur représentation en Java. Après beaucoup de googling et de chagrin, je dois demander une dernière fois comment effectuer une arithmétique logique sur des bits qui devraient être non signés, mais qui sont représentés comme étant signés en Java.Effectuer des décalages à gauche bit à bit sur les données "signées" en Java - préférable de passer à JNI?
Ok: Je suis en train de transférer un programme C# vers Java. Le programme traite de la manipulation de bitmap, et en tant que telle une grande partie des données dans l'application est représentée par byte
, un entier non signé de 8 bits. Il existe de nombreuses suggestions pour utiliser à la place le type de données short
en Java afin d '"imiter" le plus près possible l'entier non signé de 8 octets.
Je ne crois pas que ce soit possible pour moi car le code C# effectue de nombreuses opérations de décalage et d'ET avec mes données d'octets. Par exemple, si data
est un tableau d'octets, et ce bloc de code existe en C#:
int cmdtype = data[pos] >> 5;
int len = (data[pos] & 0x1F) + 1;
if (cmdtype == 7)
{
cmdtype = (data[pos] & 0x1C) >> 2;
len = ((data[pos] & 3) << 8) + data[pos + 1] + 1;
pos++;
}
Ce n'est pas une simple question de simplement coulée data
comme short
et se fait avec lui pour le faire fonctionner en Java . En ce qui concerne la logique, l'exigence que mes données restent en 8 bits non signées est significative; 16 bits non signé serait visser des maths comme ci-dessus. Suis-je ici? En effet, après avoir précédemment "faux casting" byte
avec 0XFF
et char
en Java et ne pas obtenir les bons résultats, je crains de tomber dans une impasse.
Maintenant, dans une autre partie du code, j'effectue une manipulation de pixels bitmap. Comme c'est un processus de longue durée, j'ai décidé de faire un appel au code natif via JNI. Je me suis récemment rendu compte que je pouvais utiliser le type de données uint8_t
et obtenir la représentation la plus proche du type de données C# byte
.
La solution pour faire fonctionner toutes mes fonctionnalités dépendantes des données dans JNI? Cela semble très inefficace, à la fois pour réécrire et pour effectuer. La solution est-elle de refaire les maths en Java pour que la logique reste la même? Que semble droite, mais a le potentiel d'induire un anévrisme, pour ne pas mentionner les mathématiques défectueuses.
J'apprécie toutes les suggestions.
Pourriez-vous ajouter des commentaires indiquant ce que C# fait par rapport à ce que Java fait à chaque étape de l'extrait de code? Je ne pense pas que je puisse déchiffrer tous les endroits dans ce code où vous pourriez voir des problèmes par moi-même. –
Je n'ai rien que je classerais comme une réponse, mais si vous faites beaucoup de twittling, je suggère d'écrire une classe simple en utilisant JNI qui fait cela plutôt que de faire beaucoup de casting. Cela nuira aux performances, au débogage et à la lisibilité. Peu importe, je continuerais à profiler le code avant de tout convertir en JNI. Concentrez-vous sur les domaines qui en ont le plus besoin. –
@John Je ne propose pas de tout refaire dans JNI - je me demandais juste si c'était une solution viable. – GJTorikian