在C语言中,字符型变量用char来定义,计算机会为每个字符型变量分配一个字节(Byte)的内存空间,即8bit。
在五子棋(围棋)、熄灯问题等问腿当中,他们有着一个共同的特点——每一个位置只有两种可能的情况,即记录棋盘局势的时候,我们可以选择用0表示白棋,1表示黑棋;记录开关情况时,0表示关灯,1表示开灯。
利用数组固然方便,但是为了节省内存空间,我们可以利用C语言的按位运算来实现上述情况。
基本操作
//获得第i位的码
int getBit(char ch, int i)
{
return (ch >> (i - 1)) & 1;
}
//对第i位的码进行赋值
void setBit(char &ch, int i, int v)
{
if (v)
{
ch |= v << (i - 1);
}
else
{
ch &= ~(1 << (i - 1));
}
}
//对第i位的码进行翻转(0变1,1变0)
void flipBit(char &ch, int i)
{
ch ^= 1 << (i - 1);
}
测试样例
int main()
{
char ch;
for (int i = 0; i < 16; ++i)
{
ch = i;
printf("(int)ch = %d\n", ch);
printf("(bit)ch = ");
for (int j = 8; j >= 1; --j)
{
printf("%d", getBit(ch, j));
}
printf("\n");
}
for (char i = 'a'; i <= 'z'; ++i)
{
ch = i;
printf("(char)ch = %c\n", ch);
printf("(int)ch = %d\n", ch);
printf("(bit)ch = ");
for (int j = 8; j >= 1; --j)
{
printf("%d", getBit(ch, j));
}
printf("\n");
}
return 0;
}
输出情况
(int)ch = 0
(bit)ch = 00000000
(int)ch = 1
(bit)ch = 00000001
(int)ch = 2
(bit)ch = 00000010
(int)ch = 3
(bit)ch = 00000011
(int)ch = 4
(bit)ch = 00000100
(int)ch = 5
(bit)ch = 00000101
(int)ch = 6
(bit)ch = 00000110
(int)ch = 7
(bit)ch = 00000111
(int)ch = 8
(bit)ch = 00001000
(int)ch = 9
(bit)ch = 00001001
(int)ch = 10
(bit)ch = 00001010
(int)ch = 11
(bit)ch = 00001011
(int)ch = 12
(bit)ch = 00001100
(int)ch = 13
(bit)ch = 00001101
(int)ch = 14
(bit)ch = 00001110
(int)ch = 15
(bit)ch = 00001111
(char)ch = a
(int)ch = 97
(bit)ch = 01100001
(char)ch = b
(int)ch = 98
(bit)ch = 01100010
(char)ch = c
(int)ch = 99
(bit)ch = 01100011
(char)ch = d
(int)ch = 100
(bit)ch = 01100100
(char)ch = e
(int)ch = 101
(bit)ch = 01100101
(char)ch = f
(int)ch = 102
(bit)ch = 01100110
(char)ch = g
(int)ch = 103
(bit)ch = 01100111
(char)ch = h
(int)ch = 104
(bit)ch = 01101000
(char)ch = i
(int)ch = 105
(bit)ch = 01101001
(char)ch = j
(int)ch = 106
(bit)ch = 01101010
(char)ch = k
(int)ch = 107
(bit)ch = 01101011
(char)ch = l
(int)ch = 108
(bit)ch = 01101100
(char)ch = m
(int)ch = 109
(bit)ch = 01101101
(char)ch = n
(int)ch = 110
(bit)ch = 01101110
(char)ch = o
(int)ch = 111
(bit)ch = 01101111
(char)ch = p
(int)ch = 112
(bit)ch = 01110000
(char)ch = q
(int)ch = 113
(bit)ch = 01110001
(char)ch = r
(int)ch = 114
(bit)ch = 01110010
(char)ch = s
(int)ch = 115
(bit)ch = 01110011
(char)ch = t
(int)ch = 116
(bit)ch = 01110100
(char)ch = u
(int)ch = 117
(bit)ch = 01110101
(char)ch = v
(int)ch = 118
(bit)ch = 01110110
(char)ch = w
(int)ch = 119
(bit)ch = 01110111
(char)ch = x
(int)ch = 120
(bit)ch = 01111000
(char)ch = y
(int)ch = 121
(bit)ch = 01111001
(char)ch = z
(int)ch = 122
(bit)ch = 01111010