Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.
7234 Discussions

C++ code for uint128_t divide_uint128_by_uint64(...)

richter__dan
Beginner
642 Views

How to program function in C++ in Visual Studio 2022

uint128_t divide_uint128_by_uint64(uint128_t dividend, uint64_t divisor, uint64_t* remainder)


without using big number libraries? Note the result can exceed 64-bit i.e. I can't use _udiv128 intrinsic.

Do you know of a link to the Intel sample code?

0 Kudos
1 Reply
richter__dan
Beginner
570 Views

What do you think about this code:

struct uint128_t {
    uint64_t hi;
    uint64_t lo;
};

 

uint128_t divide_uint128_by_uint64(uint128_t dividend, uint64_t divisor, uint64_t* remainder) {
    if (divisor == 0) {
        throw std::runtime_error("Division by zero");
    }

    uint128_t quotient = { 0, 0 };

    // Perform the division manually for uint128_t
    uint64_t temp_rem = 0;
    for (int i = 127; i >= 0; --i) {
        temp_rem = (temp_rem << 1) | ((dividend.hi >> (i - 64)) & 1);
        if (temp_rem >= divisor) {
            quotient.hi |= (1ULL << (i - 64));
            temp_rem -= divisor;
        }
    }
    for (int i = 63; i >= 0; --i) {
        temp_rem = (temp_rem << 1) | ((dividend.lo >> i) & 1);
        if (temp_rem >= divisor) {
            quotient.lo |= (1ULL << i);
            temp_rem -= divisor;
        }
    }
    *remainder = temp_rem;
    return quotient;
}

 

 

0 Kudos
Reply