Биты и байтовые операции - PullRequest
0 голосов
/ 19 июня 2010
/* Bit Masking */
/* Bit masking can be used to switch a character between lowercase and uppercase */
#define BIT_POS(N) ( 1U << (N) )
#define SET_FLAG(N, F) ( (N) |= (F) )
#define CLR_FLAG(N, F) ( (N) &= -(F) )
#define TST_FLAG(N, F) ( (N) & (F) )
#define BIT_RANGE(N, M) ( BIT_POS((M)+1 - (N))-1 << (N) )
#define BIT_SHIFTL(B, N) ( (unsigned)(B) << (N) )
#define BIT_SHIFTR(B, N) ( (unsigned)(B) >> (N) )
#define SET_MFLAG(N, F, V) ( CLR_FLAG(N, F), SET_FLAG(N, V) )
#define CLR_MFLAG(N, F) ( (N) &= ~(F) )
#define GET_MFLAG(N, F) ( (N) & (F) )

#include <stdio.h>
void main()
{
    unsigned char ascii_char = ‘A’; /* char = 8 bits only */
    int test_nbr = 10;
    printf(“Starting character = %c\n”, ascii_char);
    /* The 5th bit position determines if the character is
    uppercase or lowercase.
    5th bit = 0 - Uppercase
    5th bit = 1 - Lowercase */
    printf(“\nTurn 5th bit on = %c\n”, SET_FLAG(ascii_char, BIT_POS(5)) );
    printf(“Turn 5th bit off = %c\n\n”, CLR_FLAG(ascii_char, BIT_POS(5)) );
    printf(“Look at shifting bits\n”);
    printf(“=====================\n”);
    printf(“Current value = %d\n”, test_nbr);
    printf(“Shifting one position left = %d\n”,
    test_nbr = BIT_SHIFTL(test_nbr, 1) );
    printf(“Shifting two positions right = %d\n”,
    BIT_SHIFTR(test_nbr, 2) );
}

В приведенном выше коде, что означает U в

#define BIT_POS(N) ( 1U << (N) )

. Кроме того, вышеприведенная программа прекрасно компилируется и выводит

Starting character = A 

Turn 5th bit on = a  
Turn 5th bit off = ` 

Look at shifting bits
=====================
Current value = 10
Shifting one position left = 20
Shifting two positions right = 5

но когдабит выключен, результат должен быть A вместо `(ascii 96), пожалуйста, уточните .... Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 июня 2010

Проблема заключается в этой строке:

#define CLR_FLAG(N, F) ( (N) &= -(F) )

Макрос CLR_FLAG выполняет побитовое значение, а также N и -F.То есть N и минус- F.То, что вы действительно хотите сделать, это использовать побитовое дополнение F:

#define CLR_FLAG(N, F) ( (N) &= ~(F) )

Обратите внимание, что теперь я использую ~F.Оператор ~ выполняет побитовое not.

2 голосов
/ 19 июня 2010

U означает, что «1» является беззнаковым целым, в отличие от потенциально подписанного целого.

См. здесь .

Что касается другой проблемы; Я бы предположил, что - в CLR_FLAG вызывает проблему; попробуйте использовать '~' (по битам нет). Хотя не проверял это.

0 голосов
/ 19 июня 2010

Если вы действительно хотите изменить символ между прописными и строчными буквами, вам не следует делать это таким образом. Используйте взамен toupper () / tolower () . С помощью этих подпрограмм ваше намерение становится намного более ясным, и любые региональные различия в отношении символов верхнего и нижнего регистра учитываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...