Как умножить число с плавающей запятой, используя побитовые операторы без оператора умножения в C - PullRequest
0 голосов
/ 15 февраля 2019

В C мне дают int x, и я должен использовать только следующие побитовые и логические операторы для умножения x на 2: << >> ~ | ^ &.Операторы + and * специально запрещены.

Обычно это было бы легко, как я мог бы просто сделать x << 1.Тем не менее, цель этой проблемы состоит в том, чтобы предположить, что этот x содержит значение с точностью до float.

Я считаю, что смысл притворяться, что x является float, состоит в том, чтобы побудить нас задуматься о числах с плавающей запятой и о том, как правильно их умножить, применяя ранее упомянутые сдвиги и логические операторы.

Когда речь идет о смещении значений с плавающей запятой, мое текущее понимание состоит в том, что биты с плавающей запятой могут быть искажены при сдвиге.Это правильно?Если нет, то почему?В противном случае, мое понимание верно, и я застрял на том, как это осуществить.Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 15 февраля 2019

Вам нужно увеличить показатель степени на 1, чтобы удвоить значение с плавающей запятой.Это можно сделать с помощью сумматора-переносчика:

#include <stdio.h>
#include <stdint.h>

int main()
{
    float f = 3.14f ;           // Test value
    uint32_t* x = (int*)(&f) ;  // get "bits view" of test value

    // increment exponent
    uint32_t mask = 0x00800000 ;
    *x ^= mask ;
    while( (*x & mask) == 0 && 
           mask != 0x80000000 )
    {
        mask <<= 1 ;
        *x ^= mask ;
    } 

    // Show result
    printf( "%f", f ) ;

    return 0;
}

Вывод приведенного выше кода:

6.280000

Решение не связано с переполнением экспоненты - для этого потребуется мантиссарегулировка.

...