Advertisement
Alexxik

Untitled

Mar 18th, 2024 (edited)
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.04 KB | None | 0 0
  1. // MARK: - Сумма hex чисел
  2.  
  3. // Создание словарей для преобразования шестнадцатеричных значений в десятичные и наоборот
  4. let hexValueOfDec: [Character: Int] = [
  5.     "0": 0, "1": 1, "2": 2, "3": 3, "4": 4,
  6.     "5": 5, "6": 6, "7": 7, "8": 8, "9": 9,
  7.     "A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15
  8. ]
  9.  
  10. let decValueOfHex: [Int: Character] = [
  11.     0: "0", 1: "1", 2: "2", 3: "3", 4: "4",
  12.     5: "5", 6: "6", 7: "7", 8: "8", 9: "9",
  13.     10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "F"
  14. ]
  15.  
  16. // Функция для сложения двух шестнадцатеричных чисел
  17. func addHex(_ a: String, _ b: String) -> String {
  18.     // Проверка, если длина первой строки
  19.     // больше или равна длине второй строки
  20.     var (a, b) = (a, b)
  21.     if a.count < b.count {
  22.         swap(&a, &b)
  23.     }
  24.     // Хранение длины обеих строк
  25.     let (l1, l2) = (a.count, b.count)
  26.     var ans = ""
  27.     // Инициализация переноса как нуля
  28.     var carry = 0
  29.     var (i, j) = (l1 - 1, l2 - 1)
  30.     // Перебор до конца второй строки
  31.     // для полного прохода
  32.     while j >= 0 {
  33.         // Десятичное значение элемента в a[i]
  34.         // Десятичное значение элемента в b[i]
  35.         let sum = hexValueOfDec[a[a.index(a.startIndex, offsetBy: i)]]! +
  36.                   hexValueOfDec[b[b.index(b.startIndex, offsetBy: j)]] + carry
  37.         // Шестнадцатеричное значение суммы % 16
  38.         // для получения бита сложения
  39.         let additionBit = decValueOfHex[sum % 16]!
  40.         // Добавить additionBit к ответу
  41.         ans.append(additionBit)
  42.         // Обновление переноса
  43.         carry = sum / 16
  44.         i -= 1
  45.         j -= 1
  46.     }
  47.     // Перебор оставшихся элементов
  48.     // строки a
  49.     while i >= 0 {
  50.         // Десятичное значение элемента
  51.         // в a[i]
  52.         let sum = hexValueOfDec[a[a.index(a.startIndex, offsetBy: i)]]! + carry
  53.         // Шестнадцатеричное значение суммы % 16
  54.         // для получения бита сложения
  55.         let additionBit = decValueOfHex[sum % 16]!
  56.         // Добавить additionBit к ответу
  57.         ans.append(additionBit)
  58.         // Обновление переноса
  59.         carry = sum / 16
  60.         i -= 1
  61.     }
  62.     // Проверка, остается ли еще перенос
  63.     if carry != 0 {
  64.         ans.append(decValueOfHex[carry]!)
  65.     }
  66.     // Реверс окончательной строки
  67.     // для желаемого вывода
  68.     return String(ans.reversed())
  69. }
  70.  
  71. // Код запуска
  72. let str1 = "1B"
  73. let str2 = "AD"
  74. // Вызов функции
  75. print(addHex(str1, str2))
  76.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement