数据类型,位运算,整型变量补码含1的个数,通过位运算实现扫雷游戏

一,数据类型

在这里插入图片描述
在这里插入图片描述

二,char类型的范围

在这里插入图片描述
注意:有符号范围0到127到-128到0

#include<stdio.h>
int main()
{
	for (char i = 0; i < 128; ++i)//死循环代码
	{
		printf("%2d",i);
	}
	return 0;
}
      无符号范围0到255到0
#include<stdio.h>
int main()
{
	for (char i = 0; i < 128; ++i)
	{
		printf("%2d", i);
	}
	return 0;
}

三,范围小的整形变量给范围大的整型变量扩充

1,有符号扩充符号位;
2,无符号类型扩充0;


在这里插入图片描述

四,位运算

&位与运算;
|未或运算;
^异或运算;
~位反运算;
右移运算>>相当于除以2;
<<左移运算相当于乘以2;
在这里插入图片描述

五,输入一个数字计算出其补码所含一的个数

此代码很好的体现了位的扩充
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
//int Get1Bit(int x)//输入一个负数就会陷入死循环;
//{
//	int sum = 0;
//	while(x)
//	{
//		if (x & 0x01)
//		{
//			sum += 1;
//		}
//		x = x >> 1;
//	}
//	return sum;
//}
//int Get1Bit(int x)//改进后的函数可以输入一个负数;缺点一位一位的数时间复杂度太大;
//{
//	int sum = 0;
//	for (int i = 0; i < sizeof(x) * 8; i++)
//	{
//		if (x & 0x01)
//		{
//			sum += 1;
//		}
//		x = x >> 1;
//	}
//	return sum;
//}
//int Get1Bit(int x)//注意数字在计算机内存中以补码存放
//{
//	int sum = 0;
//	while (x)
//	{
//		x = x & (x - 1);
//			sum += 1;
//	
//	}
//	return sum;
//}
//int Get1Bit(int x)//查表方案解决问题;
//{
//	int sum = 0;
//	int ar[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
//	for(int i=0;i<sizeof(x)*2;i++)
//	{
//		sum = sum + ar[x&0x0f];
//		x = x >> 4;
//	}
//	
//		return sum;
//}
int Get1Bit(int x)//;
{
	int sum = 0;
	for (int i = 0; i < sizeof(x) * 2; i++)
	{
		sum = sum +"\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[x & 0x0f];
		x = x >> 4;
	}

	return sum;
}
int main()
{
    int x = 0;
	scanf_s("%d", &x);
	int y = Get1Bit(x);
	printf("%d",y);
	return 0;
	}

六,扫雷游戏的实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWSIZE 12
#define COLSIZE 12
#define MINESIZE 30   
#define SHOWINIT 0X80    //@
#define MAKEMINE 0X40
#define SHOWMINE 0X20   //#
#define MAKESUM  0X10
#define SHOWSUM  0X0F   //0x0f
#define CLEARINIT 0X7F
#define CLEARMINE 0XDF
typedef unsigned char MineType[ROWSIZE + 2][COLSIZE + 2];
void Init_Ar(MineType ar)
{
	for (int i =1; i <=ROWSIZE; i++)
	{
		for (int j =1; j <=COLSIZE; j++)
		{
			ar[i][j] = ar[i][j] | SHOWINIT;
		}
	}
	int i = 0;
	srand(time(nullptr));
	while (i < MINESIZE)
	{
		int row = rand() % ROWSIZE + 1;
		int col = rand() % COLSIZE + 1;
		if (!(ar[row][col] & MAKEMINE))
		{
			ar[row][col] = ar[row][col] | MAKEMINE;
			i++;
		}
	}
	
	for (int r = 1; r<=ROWSIZE;++r)
	{
		for (int c=1;c<=COLSIZE;++c)
		{
			if (!(ar[r][c] & MAKEMINE)) 
			{
		       unsigned char sum = 0;//int sum=0;
				for (int i = r - 1; i<= r + 1; ++i)
				{
					for (int j = c - 1;j<= c +1; ++j) 
					{
					  if(ar[i][j] & MAKEMINE)
					   {
						 sum+=1;
					    }
					}
				}
				ar[r][c] = ar[r][c]|MAKESUM;
				ar[r][c] = ar[r][c] | (0x0f & sum);
			}
		}
	}
}
void Printf_Arl(MineType ar)
{
	printf("  ");
	for (int i=1;i<=COLSIZE;i++) 
	{
		printf("%2d",i);
	}
	printf("\n");
	for (int i=1;i<=ROWSIZE;i++)
	{
		printf("%2d",i);
		for (int j=1;j<=COLSIZE;j++)
		{
			if (ar[i][j] & SHOWINIT)
			{
				printf("%2c",'@');
			}
			else if (ar[i][j] & SHOWMINE)//if (ar[i][j] &MAKEMINE)
			{
				printf("%2c", '#');
			}
			else //if(ar[i][j] & MAKESUM)
			{
		      printf("%2d",ar[i][j] & SHOWSUM);// printf("%2c", '@')
			}
		}
		printf("\n");
	}
	printf("\n");
}
int main()
{
	MineType ar = {};
	Init_Ar(ar);
	
	int row; 
	int col;
	int i = 0;
	char ch;
	while (i < MINESIZE)
	{
		Printf_Arl(ar);
		printf("input row col select(# ,0, @)\n");
		scanf_s("%d %d %c",&row,&col,&ch);
		if (row<1 || row>ROWSIZE||col<1||col>COLSIZE)
		{
			printf("row col input error\n");
			continue;
		}
		if (ch=='#')
		{
			ar[row][col] &= CLEARINIT;
			ar[row][col] |= SHOWMINE;
			if (ar[row][col] & MAKEMINE)
		    {
			 i++;
		    }
		 }
		/*else if (ch == '0')
					{
						if (ar[row][col] & MAKEMINE)
						{
							printf("炸死了 \n");
							break;
						}
						ar[row][col] &= CLEARINIT;
					}*/
		else if(ch=='0')
		 {
			if(ar[row][col]&MAKEMINE)
			{
				printf("炸死了\n");
				break;
			}
			ar[row][col]&=CLEARINIT;
		}
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值