Осуществить вывод 128-битных чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Хотел бы реализовать их с основными арифметическими операциями. Сначала думал про:
typedef unsigned uint128[4];
То есть как массив 4-байтовых. Но как осуществлять, например, вывод такого числа, непонятно. Вот пример кода:
#include <stdio.h>
 
typedef unsigned uint128[4];
typedef unsigned long long uint64;
 
void Plus(uint128 num1, uint128 num2, uint128 res)
{
    uint64 sum, r = 0;
 
    memset(res, 0, 16);
 
    for (int i = 3; i >= 0; --i)
    {
        sum = (uint64)num1[i] + (uint64)num2[i];
        res[i] += sum & 0xffffffffull;
        if ((sum & 0xffffffff00000000ull) && i)
            res[i - 1]++;       
    }
}
 
void Print(uint128 num)
{
    for (int i = 0; i < 4; ++i)
        if (num[i])
            printf("%X", num[i]);
}
 
int main()
{
    uint128 a = { 0, 0, 0, 0xFFFFFFFF },
            b = { 0, 0, 0, 0x1234 },
            c;
    Plus(a, b, c);
    Print(c);   
 
    getchar();
}

Решение задачи: «Осуществить вывод 128-битных чисел»

textual
Листинг программы
#include <stdio.h>
 
typedef unsigned uint128[4];
typedef unsigned long long uint64;
 
void Plus(uint128 num1, uint128 num2, uint128 res)
{
    uint64 sum, r = 0;
 
    memset(res, 0, 16);
 
    for (int i = 3; i >= 0; --i)
    {
        sum = (uint64)num1[i] + (uint64)num2[i];
        res[i] += sum & 0xffffffffull;
        if ((sum & 0xffffffff00000000ull) && i)
            res[i - 1]++;
    }
}
 
void Print(uint128 num)
{
    int i = -1;
    while (!num[++i]);
    for (; i < 4; ++i)
        printf("%08X", num[i]);
}
 
int main()
{
    uint128 a = { 0, 0, 0xABCDEF, 0xFFFFFFFF },
        b = { 0, 0, 0x8965, 0x56781234 },
        c;
    Plus(a, b, c);
    Print(c);
 
    getchar();
}

Объяснение кода листинга программы

Вывод 128-битных чисел

  1. Включение файла стандартного ввода/вывода
  2. Объявление типов данных:
    • uint128 - массив из 4-х 32-битных чисел, эмулирующий 128-битное число
    • uint64 - 64-битное беззнаковое число
  3. Определение функции Plus:
    • Принимает три параметра типа uint128: num1, num2 и res, которые представляют собой 128-битные числа.
    • Использует цикл for для обработки каждого 32-битного числа в 128-битных числах num1 и num2.
    • Переменная sum используется для хранения суммы двух 32-битных чисел.
    • Переменная r используется для хранения остатка от предыдущего вычисления.
    • Используется функция memset для инициализации всех элементов массива res нулями.
    • Каждое 32-битное число в num1 и num2 сдвигается вправо на 32 бита, чтобы получить 64-битное число.
    • Сумма двух 64-битных чисел записывается в первый 64-битный элемент результата.
    • Если сумма двух 64-битных чисел больше 4 ГБ, то увеличивается второй 64-битный элемент результата.
  4. Определение функции Print:
    • Принимает один параметр типа uint128 - num, представляющий собой 128-битное число.
    • Использует цикл while для поиска первого ненулевого элемента в массиве num.
    • Используется функция printf для вывода каждого 32-битного числа в 16-ричной системе счисления.
  5. Определение переменных и основной функции:
    • Объявление трех переменных типа uint128: a, b и c, которые представляют собой 128-битные числа.
    • Инициализация переменных a и b значениями 0.
    • Третий элемент переменной a инициализируется значением 0xABCDEF, а третий элемент переменной b инициализируется значением 0x8965.
    • Вызов функции Plus для переменной c с аргументами a и b.
    • Вызов функции Print для переменной c.
    • Вызов функции getchar для ожидания нажатия клавиши. Код выполняет сложение двух 128-битных чисел и вывод результата в 16-ричной системе счисления.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.571 из 5
Похожие ответы