Битовые операции упражнения по программированию в C


Комментарий сверху не последовало, потому что я распечатал содержимое. Я просто хочу, чтобы мнение о стиле кодирования.

    /*
     * Write a function setbits(x,p,n,y) that returns x with the n bits
     * that begin at position p set to the rightmost n bits of y, leaving
     * the other bits unchanged in the least number of lines.
     *
     * Note: function signatures and curly brackets dont count towards 
     * the number of lines. You must also declare your variables, and 
     * call the function
     *
     * build with:
     *   gcc -o bit_twiddle -Wall -g -lm ./bit_twiddle.c
     */

    #include <stdio.h>
    #include <math.h>
    #include <limits.h>

    unsigned setbits(unsigned x, unsigned p, unsigned n, unsigned y) {
        x |= (y & ~(~0 << n)) << p;
        size_t s = (int)(log(INT_MAX)/log(2)) + 1;
        printf("An int is %d bits\n", s);
        int mask = pow(2.0, (int)s);
        do {
            ((x & mask) == 0) ? printf("0") : printf("1");
            ((s%4)==0) ? printf(" ") : printf("");
            x <<= 1;
        } while (s--);
        printf("\n");
    }

    void main( ) {
        unsigned retrn=1, begin=3, nbits=3, input=7;
        unsigned x = setbits(retrn, begin, nbits, input);
    }

Обновление

x |= (y & ~(0 << n)) << p --> x |= (y & ~(~0 << n)) << p


774
4
c
задан 16 ноября 2011 в 01:11 Источник Поделиться
Комментарии
1 ответ

Я думаю, что ваш код делает не совсем то, что комментировать хочется. В строке:

x |= (y & ~(0 << n)) << p;

0 << N не равно 0. Если вы хотите, чтобы н крайний правый бит г вы можете использовать маску как (1< (что Н 1 бит).
Сейчас по вашему стилю кода, когда вы кодирования немного манипулируя задач, то вам лучше делать его полностью с побитовые операторы (по крайней мере, использовать другие функции очень мало). Вот в этом коде, с помощью журнала и пр можно избежать. Если вы хотите получить число битов в целое число, можно использовать оператор sizeof, как показано ниже:

size_t s = sizeof(int) << 3;

здесь << 3 равна * 8, потому что наверняка каждый байт имеет 8 бит (он работает на целочисленные типы любого размера, просто заменить тип int с любым другим типом, как короткий или длинный).

Теперь вместо того, чтобы использовать военнопленных(2, С) можно написать 1 << ы :)

И о вашей печати, вы можете заменить с%4 С З&3 (думать об этом). И я предпочитаю смещается вниз маску , вместо того чтобы перекладывать до Х (здесь это не имеет никакого значения, но когда вы работаете с подписанными значениями, потому что знак будет сохранен в левых сдвигов). И для сокращения количества линий для печати, вы можете использовать для петли.

7
ответ дан 16 ноября 2011 в 06:11 Источник Поделиться