在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 = %dn", 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 = %cn", ch);
printf("(int)ch = %dn", 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



