2010-06-19 5 views
0
/* 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 

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

+3

ahh, пожалуйста, отформатируйте свой код так, чтобы его можно было прочитать. при редактировании этого сообщения выделите весь код и нажмите кнопку кода в редакторе. кнопка, на которой есть «101010». – jordanstephens

+0

@jordanstephens: Я взял на себя смелость сделать именно это. –

+0

@ Nathan Fellman, спасибо, я не могу редактировать сообщения ... – jordanstephens

ответ

2

U означает, что '1' является неподписанным int, а не потенциально подписанным int.

См. here.

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

2

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

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

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

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

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

0

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

Смежные вопросы