C/C++ 按位运算

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马尼亚硬拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值