Как сложить три байта в Scala? - PullRequest
0 голосов
/ 04 марта 2019

Я пробовал много способов, но до сих пор не знаю, как это сделать:

def to24Bits(p: Int, q: Int, r: Int): Int =  { 
   (p<<8|q<<16|r<<24)
}


to24Bits(0xFF, 0x00, 0x00) => 0xFF0000

to24Bits(0x00, 0xFF, 0x00) => 0x0000FF

to24Bits(0x00, 0xFF, 0x00) => 0x0000FF

to24Bits(0x11, 0x22, 0x33) => 0x112233

to24Bits(0xFF, 0xFF, 0xFF) => 0xFFFFFF

Я редактировал это:

to24Bits(0xffffff11, 0xffffff88, 0xffffff00) => 0x118800

1 Ответ

0 голосов
/ 04 марта 2019

Если (по какой-либо причине) вы хотите подать в него отрицательные целые числа, тогда вам нужно обрезать все биты выше первого байта с помощью & 0xFF:

def to24Bits(p: Int, q: Int, r: Int): Int = {
  ((p & 0xFF) << 16) | ((q & 0xFF) << 8) | (r & 0xFF)
}

Ваши примеры:

for ((p, q, r) <- List(
  (0xFF, 0x00, 0x00),
  (0x00, 0xFF, 0x00),
  (0x00, 0x00, 0xFF),
  (0x11, 0x22, 0x33),
  (0xFF, 0xFF, 0xFF),
  (0xffffff11, 0xffffff88, 0xffffff00)
)) {
  printf("0x%06X\n", to24Bits(p, q, r))
}

Выход:

0xFF0000
0x00FF00
0x0000FF
0x112233
0xFFFFFF
0x118800
...