unsigned

评playerc网友的\"求比指定数大且最小的“不重复数”问题\"

有些话、适合烂在心里 提交于 2020-01-06 04:39:44
  对于“大于指定正整数的最小“不重复数”问题”,最初,在 算法:求比指定数大且最小的“不重复数”问题的高效实现 中,我给出了一个递归写法,之后在同一篇博文中给出了一个非递归写法。   后来在 对Alexia(minmin)网友代码的评论及对“求比指定数大且最小的‘不重复数’问题”代码的改进 中对我的写法进行了更详细的说明,并进行了重要改进。使之适合范围更大。   在 评playerc网友的"求比指定数大且最小的“不重复数”问题" 中评论了playerc的写法。   playerc的思路没问题,但代码复杂且存在错误。现在我按照这个思路给出我的写法。 详细的分析求解过程,就不在正文中描述了。代码中有详尽的注释,在前几篇博文中也进行了说明。这次写法与前面的主要不同点的是,实现了只一次加0101……。 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define SIZE(x) (sizeof (x) / sizeof (x)[0]) 5 #define BE_DIG(x) ( '0' <= x && x <= '9' ) 6 #define MAX 128 7 8 typedef struct 9 { 10 unsigned char digs[ MAX + 1 ] ;//从低位到高位存储各位数字 11 //并为可能发生的进位预留一个位置

按键控制数字加1减1

孤者浪人 提交于 2020-01-05 02:25:26
前面学习了数码管和按键,将两者结合,完成一个用两个按键控制加减数字的小程序,一个按键控制加1另一个控制减1。 #include <reg52.h> sbit KeyAdd = P0^0; //加1按键 sbit KeyDec = P0^1; //减1按键 sbit LATCH1 = P2^2; //段锁存 sbit LATCH2 = P2^3; //位锁存 unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码 unsigned char TempData[8]; //存储显示值 void Delay(unsigned int t); void Display(unsigned char FirstBit,unsigned char Num); void main(void) { unsigned char num = 0; while (1) { if (!KeyAdd) //加1按键有效 { Delay(1500); //延时去抖 一般10-20ms if (!KeyAdd) { while (

[51单片机学习笔记FOUR]----16*16LED点阵

♀尐吖头ヾ 提交于 2020-01-05 01:57:55
一、LED点阵发光原理 8*8单色单片机结构图如下: 从电路图中很简单的就可以看出来,想要点亮点阵中的某一个LED灯。只要 使得那个灯所在的行输出高电平,所在列输出低电平就好。 二、点阵扫描实验 1 /*********************************************** 2 实验名称: 点阵扫描 3 实验说明: 扫描每个LED灯,检查点阵是否完好 4 实验时间: 2014/12/24 5 ***********************************************/ 6 #include <reg51.h> 7 #include <intrins.h> 8 9 #define uchar unsigned char 10 #define uint unsigned int 11 12 sbit MOSIO = P3^4;//输入口 13 sbit R_CLK = P3^5;//锁存器时钟 14 sbit S_CLK = P3^6;//移位寄存器时钟 15 16 //data3:右边半块列数据;data2:左边半块列数据 17 //data1:下边半块行数据;data0:上边半块行数据 18 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0); 19 20 void

TEA加密/解密算法

有些话、适合烂在心里 提交于 2020-01-04 21:31:01
在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。 TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。 1.加密核心函数 1 void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key) 2 { 3 unsigned int y = *firstChunk; 4 unsigned int z = *secondChunk; 5 unsigned int sum = 0; 6 7 unsigned int delta = 0x9e3779b9; 8 9 for (int i = 0; i < 8; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样) 10 { 11 sum += delta; 12 y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1]); 13 z += ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3]); 14 } 15 16 *firstChunk = y; 17 *secondChunk =

C结构体之位域(位段)

狂风中的少年 提交于 2020-01-04 14:37:18
几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存对齐全攻略–涉及位域的内存对齐原则 本文主要对位域相关知识进行了一下梳理,参考如下: C语言中的位域 史上最全的C位域总结 2 C结构体之位域(位段) C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。 位域的作用主要是节省内存资源,使数据结构更紧凑。 1. 一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度。 如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct BitField { unsigned int a:4; //占用4个二进制位; unsigned int :0; //空位域,自动置0; unsigned int b:4; //占用4个二进制位,从下一个存储单元开始存放; unsigned int c:4; //占用4个二进制位; unsigned int d:5; //占用5个二进制位,剩余的4个bit不够存储4个bit的数据,从下一个存储单元开始存放; unsigned int :0; //空位域,自动置0; unsigned int e:4; /

《30天自制操作系统》笔记(07)——内存管理

我的梦境 提交于 2020-01-04 14:31:39
《30天自制操作系统》笔记(07)——内存管理 进度回顾 上一篇 中处理掉了绝大部分与CPU配置相关的东西。本篇介绍内存管理的 思路 和 算法 。 现在想想,从软件工程师的角度看,CPU也只是一个软件而已:它的功能就是加载指令、执行指令和响应中断,而响应中断也是在加载指令、执行指令。就像火车沿着一条环形铁轨前进;当中断发生时,就好像铁轨岔口处变轨了,火车就顺着另一条轨迹走了;走完之后又绕回来重新开始。决定CPU是否变轨的,就是CPU里的特定寄存器。 这是题外话,就此为止。 什么是内存管理 假设内存大小是128MB,应用程序A暂时需要100KB,画面控制需要1.2MB……。 像这样,操作系统有时要 分配 一定大小的内存,用完后又要 收回 。因此,必须管理好哪些内存空闲可用,哪些正在被占用。这就是内存管理。 内存管理的两个任务,一是内存分配,一是内存释放。 如何获取内存容量 检查内存容量的方法 要管理内存,首先得知道操作系统所在的这个计算机内存有多大。检查内存容量的方法很简单,就是从要检查的起始位置到最后位置依次写入一个数值(例如0xaa55aa55),然后按位反转,检查是否正确地完成了反转(变成0x55aa55aa);然后再次反转,检查是否正确地完成了反转。如果反转结果都是正确的,说明这个地址的内存是存在的;否则就说明内存的最大地址就到此为止了。其代码如下。 1 unsigned

Are FOR loops with char iterators in C possible?

十年热恋 提交于 2020-01-04 05:44:57
问题 I'm having a problem using an unsigned char as an iterator. Using the following code results in being stuck inside a FOR loop. The output looks like this. unsigned char i; char * arr; int * freq; arr = (char *)(malloc(256*sizeof(char))); freq = (int *)(malloc(256*sizeof(int))); for (i=0; i<=255;i++){ arr[i]=i; freq[i]=0; printf("%c",i); } My question is why this happens? Is it due to using an unsigned char as an iterator? 回答1: i <= 255 If i is of type unsigned char and that type is 8 bit on

C语言类型强制转换

五迷三道 提交于 2020-01-04 05:43:26
C语言类型强制转换 强制类型转换 是通过类型转换运算来实现的。其一般形式为: (类型说明符) ( 表达式 ) 其功能是把表达式的运算结果 强制转换 成类型说明符所表示的类型。 目录 1 基本介绍 2 注意事项 1 基本介绍 编辑 强制类型转换 是通过类型转换运算来实现的。其一般形式为:(类型说明符)( 表达式 )其功能是把表达式的运算结果 强制转换 成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。例如: (float) a 把a转换为实型,(int)(x+y) 把x+y的结果转换为 整型 。在使用 强制转换 时应注意以下问题: 2 注意事项 编辑 1.类型说明符和 表达式 都必须加括号(单个 变量 可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。 2.无论是 强制转换 或是自动转换,都只是为了本次运算的需要而对 变量 的数据长度进行的临时性转换,而不改变数据说明时对该 变量 定义的类型。 例1: main() { float f=5.75; printf("f=%d,f=%f\n",(int)f,f); } f=5,f=5.750000 将float f 强制转换 成int f float f=5.75;printf("(int)f=%d,f=%f\n",(int)f

详解C语言的类型转换

穿精又带淫゛_ 提交于 2020-01-04 05:42:56
1.自动类型转换 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待, 取值范围总是0~255)。 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。 图中 横向箭头表示必须的转换 ,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换 ,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。 所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。 这些转换可以说是自动的,当然,C语言也提供了以显式的形式强制转换类型的机制。 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。 在进行自动类型转换的时候,如果原来的数是无符号数,那么在扩展的时候,高位填充的是0;如果是有符号数,那么高位填充的时符号位! 2.赋值中的类型转换

赋值中的强制类型转换

a 夏天 提交于 2020-01-04 05:42:35
赋值中的类型转换 当 赋值运算符 两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧 表达式 的类型转换为左侧 变量 的类型。具体的转换如下: (1) 浮点型 与 整型 ● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分(是直接舍弃,编译器不会自动四舍五入), 只保留整数部分。将 整型 值赋给 浮点型 变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。 (2) 单、 双精度浮点型 ● 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。 (3) char型与int型 ● int型数值赋给char型 变量 时,只保留其最低8位,高位部分舍弃。 ● char型数值赋给int型 变量 时, 一些 编译程序 不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。对于使用者来讲,如果原来char型数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不同。 (4) int型与long型 ● long型数据赋给int型 变量 时,将低16位值送给int型变量