/* 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) , пожалуйста, уточните .... Спасибо.
ahh, пожалуйста, отформатируйте свой код так, чтобы его можно было прочитать. при редактировании этого сообщения выделите весь код и нажмите кнопку кода в редакторе. кнопка, на которой есть «101010». – jordanstephens
@jordanstephens: Я взял на себя смелость сделать именно это. –
@ Nathan Fellman, спасибо, я не могу редактировать сообщения ... – jordanstephens