2015-10-29 51 views
12

bayt ile çalışmaz. "B ve 0xff" kullanmaya çalışıyorum ama işe yaramıyor. Bitsel "ve", bayt değil, Int üzerinde çalışıyor gibi görünüyor.bitsel & I gibi KOTLIN kod yazmaya çalışıyorum KOTLIN

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

her zaman orijinal değeri döndürecektir

1 and 0xff 
+0

Eğer kod ne yaptığını açıklayabilir misiniz? – voddan

cevap

13

Kolin sadece Int ve Long için kullanılabilir bitsel operatör benzeri infix functions sağlar.

Yani bitsel op gerçekleştirmek için ints için bayt dönüştürmek için gerekli:

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

GÜNCELLEME: KOTLIN 1.1 yana bu operasyonlar Byte doğrudan mevcuttur.

bitwiseOperations.kt Gönderen:

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

Ayrıca, java'nın bu genişlemeyi dönüştürdüğünü de unutmayın. Sadece örtük. – Raman

5

Bit "ve" herhangi bir bayt değeri ve 0xff kullanımına Tamam.

bir şemada bitlerini çizerseniz bunu görmek basittir:

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

'dan önce böyle bir sözdizimi hiç görmedim, ancak neden bu kadar çok kişi bir baytı int'ye çevirmek için kullanıyor? –

+1

Hayır, bir 'int' kısaltmak için kullanılır, bayt olarak sığar. Javada – ams

+0

@AllenVork bayt * işaretli * ve java bitwise işlemleri yaparken bir "int" için dolaylı olarak dönüştürür (Kotlin sadece bu açık gerektirir). Bu nedenle, bu genişletme dönüşümünün, başlangıç ​​bayt değeri negatif olduğunda beklenen pozitif int değerine neden olması için, genişletilmiş int değerinin (işaret biti içeren) 3 üst düzey baytını '& 0xff' aracılığıyla maskeler. . – Raman