Конкатенация
"Конкатенация" двух шестнадцатеричных 6-значных чисел фактически означает сдвиг влево на 24 бита (поскольку каждая шестнадцатеричная цифра имеет 4 бита, а длина равна 6) первогономер и взятие второго числа поразрядно or
результат сдвига.
infix fun Long.hexConcat(num: Long) = num.or(shl(24))
Содержит
Чтобы проверить, содержится ли шестизначное шестнадцатеричное числов первых или последних 6 цифрах 12-значного шестнадцатеричного числа вы можете поразрядно and
их обоих (для проверки конца).Чтобы проверить, находится ли он в начале, вы должны сначала сдвинуть его вправо на 24 бита, а затем поразрядно and
it.
infix fun Long.containsAsHex(num: Long) = and(num) == num || shr(24) == num
Пример:
fun main() {
val a = 0x011233L
val b = 0x455677L
val c = a hexConcat b
println(c.toString(16)) // 11233455677
println(c containsAsHex a) // true
}
Конечно, вы можете параметризовать hexConcat
далее, чтобы не ограничивать его шестизначными шестизначными числами.
В случае, если шестнадцатеричное шестнадцатеричное число может быть где угодно в 12-значном шестнадцатеричном числе:
Чтобы проверить, содержит ли шестнадцатеричное число еще одно, вы сдвигаете его на 4 бита вправо до тех пор, пока его значение не станет равным 0, или вы не найдете совпадение, которое будет означать, что смещенное число поразрядно and
проверяемое числодолжен равняться числу для проверки.
infix fun Long.containsAsHex(num: Long): Boolean {
var shifted = this
while (true) {
if(shifted.and(num) == num) {
return true
}
if(shifted == 0L) {
return false
}
shifted = shifted.shr(4) // shift one hex digit
}
@Suppress("UNREACHABLE_CODE")
return false
}