diff --git a/src/main/kotlin/BinGetters.kt b/src/main/kotlin/BinGetters.kt new file mode 100644 index 0000000..5ed7493 --- /dev/null +++ b/src/main/kotlin/BinGetters.kt @@ -0,0 +1,50 @@ +package ru.thiflict.binaryutils + +/** + * Объект для получения каких либо данных из вводимого числа + * + * Репозиторий: https://git.ds1.thiflict.ru/Thiflict/BinaryUtils + * + * @author Thiflict + * + * @since[1.0.2] + */ + +object BinGetters { + + /** + * Возвращает индекс первого старшего бита из вводимого числа. + * Если в числе нет старшего бита, то возвращает `null` + * + * Тип данных для проверяемого числа: [Short]. + * + * Пример: + * ``` + * getFirstHighBitShort(67) + * ``` + * @return [Byte] + * @since[1.0.2 не тестировалось на отрицательные числа] + */ + fun getFirstHighBitShort(input: Short): Byte? { + return run { + // Для числа 0 возвращаем null + if (input == 0.toShort()) { + return null + } + + // Используем bitwise operations для корректной работы с отрицательными числами + var value = input.toInt() and 0xFFFF // Преобразуем в беззнаковое 16-битное число + var result: Byte? = null + + // Ищем первый установленный бит с начала (от старших к младшим) + for (index in 15 downTo 0) { + if (value and (1 shl index) != 0) { + result = index.toByte() + break + } + } + + result + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/GetFirstHighBitShortTest.kt b/src/test/kotlin/GetFirstHighBitShortTest.kt new file mode 100644 index 0000000..045ce73 --- /dev/null +++ b/src/test/kotlin/GetFirstHighBitShortTest.kt @@ -0,0 +1,43 @@ +import ru.thiflict.binaryutils.BinGetters.getFirstHighBitShort + +fun main() { + // Тест 1: Число 67 (00000000 01000011 в двоичном виде) + val test1 = getFirstHighBitShort(67.toShort()) + println("Тест 1 - число 67: $test1") // Ожидается 6 + + // Тест 2: Число 0 (все биты нули) + val test2 = getFirstHighBitShort(0.toShort()) + println("Тест 2 - число 0: $test2") // Ожидается null + + // Тест 3: Число 1 (только младший бит установлен) + val test3 = getFirstHighBitShort(1.toShort()) + println("Тест 3 - число 1: $test3") // Ожидается 0 + + // Тест 4: Число 32767 (максимальное положительное Short число) + val test4 = getFirstHighBitShort(32767.toShort()) + println("Тест 4 - число 32767: $test4") // Ожидается 14 + + // Тест 5: Число 16384 (только старший бит установлен) + val test5 = getFirstHighBitShort(16384.toShort()) + println("Тест 5 - число 16384: $test5") // Ожидается 14 + + // Тест 6: Число 256 (второй бит с конца установлен) + val test6 = getFirstHighBitShort(256.toShort()) + println("Тест 6 - число 256: $test6") // Ожидается 8 + + // Тест 7: Число 128 (восьмой бит с конца установлен) + val test7 = getFirstHighBitShort(128.toShort()) + println("Тест 7 - число 128: $test7") // Ожидается 7 + + // Тест 8: Число 255 (младшие 8 бит установлены) + val test8 = getFirstHighBitShort(255.toShort()) + println("Тест 8 - число 255: $test8") // Ожидается 7 + + // Тест 9: Число 32768 (внешний бит установлен - отрицательное число) + val test9 = getFirstHighBitShort((-32768).toShort()) + println("Тест 9 - число -32768: $test9") // Ожидается 15 + + // Тест 10: Число -1 (все биты установлены) + val test10 = getFirstHighBitShort((-1).toShort()) + println("Тест 10 - число -1: $test10") // Ожидается 15 +} \ No newline at end of file