一,数据类型
二,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;
}