2015-10-29 14 views
12

にバイトでは動作しません。私は "bと0xff"を使用しようとしていますが、動作しません。ビットごとの "and"はバイトではなくIntで動作するようです。ビット単位&は私のようなkotlinコードを書くしようとしているkotlin

java.lang.String.format("%02x", (b and 0xff)) 

それは常に元の値を返します

1 and 0xff 
+0

あなたはあなたのコードが何をするのか説明していただけますか?私は – voddan

答えて

13

コリンはIntLongために利用可能なビット演算子のようなinfix functionsを提供します。

だから、ビット単位のオペレーションを実行するためにint型にバイトを変換する必要があります:

val b : Byte = 127 
val res = (b.toInt() and 0x0f).toByte() // evaluates to 15 

UPDATE: Kotlin 1.1以降、これらの操作は、直接バイトで利用可能です。 bitwiseOperations.ktから

@SinceKotlin("1.1") 
public inline infix fun Byte.and(other: Byte): Byte = (this.toInt() and other.toInt()).toByte() 
+0

javaもこの変換を拡大していることに注意すると便利です。それは単に暗黙のことです。 – Raman

5

ビット単位「と」任意のバイト値から0xffの使用しても大丈夫です。

あなたが図のビットを描く場合は、これを見るために簡単です:

00101010 42 
11111111 and 0xff 
-------- 
00101010 gives 42 
+0

の前にそのような構文を見たことがありませんが、なぜそれほど多くの人々がバイトをintに変換するために使用するのですか? –

+1

いいえ、それはバイトに収まるように 'int'を切り詰めるために使われます。 – ams

+0

Javaの@AllenVorkバイトは* signed *であり、ビット操作(Kotlinは単にこれを明示的に要求する必要がある)を行うとき、javaはそれらを暗黙的に 'int'に変換します。したがって、最初のバイト値が負の場合にこの拡大変換が期待される正のint値になるようにするには、拡張されたint値(符号ビットを含む)の3つの上位バイトを '&0xff ' 。 – Raman

関連する問題