unsigned

VC++中word、uint等类型的理解

China☆狼群 提交于 2020-03-17 07:25:18
初见这些类型,真是一脸懵逼,太TM搞不懂是啥东东?但是VC++中经常用到,使用这些类型作为参数和返回值,不得已研究了一番,这才略懂皮毛。 --------------------------------------------------------------------------简单分割线------------------------------------------------------- 查了一下这些类型的定义,如下: typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef int INT; typedef unsigned int UINT; typedef unsigned int *PUINT; typedef FLOAT *PFLOAT; typedef BOOL near *PBOOL; typedef BOOL far *LPBOOL; typedef BYTE near *PBYTE; typedef BYTE far *LPBYTE; typedef int near *PINT; typedef int far *LPINT; typedef

C语言生成随机数

别说谁变了你拦得住时间么 提交于 2020-03-15 17:25:30
强烈建议阅读 → 重新整理后的文章 2012年的时候写过一篇C语言生成随机数的博客,点击量比较高。后来发现那篇博客描述的不是非常准确,这里重新整理一遍。写惯了高级语言,现在回看C的语法,真的是挺难的^o^。 一、方法介绍 生成随机数,需要用到两个函数 srand 、 rand ,头文件为 #include <stdlib.h> 1.1 void srand ( unsigned int seed ) 生成随机数种子,注意 如果使用相同的种子后面的 rand() 函数会出现一样的随机数 。常见的用法是使用一些动态的值来初始化这个种子: srand((unsigned) time(NULL));srand((int)getpid()); 1.2 int rand ( void ) 根据 srand 初始的随机数种子产生一个伪随机数(注意不是真正的随机),范围为 0 - RAND_MAX。RAND_MAX 至少为 32767,我电脑为 2147483647。可通过取模来产生不同范围的随机数,如: int randint = rand() % (MAX + 1 - MIN) + MIN; 1.3 举例实现 下面给出了一个举例的实现(POSIX.1-2001),帮助更好的理解其原理,每次调用 rand 的时候,其实是改变了一个全局变量,从而导致下一次调用返回了不同的值。 static

基本类型:实型(浮点型)

早过忘川 提交于 2020-03-13 10:13:29
一、 概念 与数学中的实数的概念差不多,在一个值的后面加上一个小数点,该值就成为一个浮点值,C语言中浮点类型有float、double和long double; 二、书写形式 类似于科学记数法,称为指数记数法或E记数法,E后面的数字代表数10的指数 三、实型与整型的区别 整数没有小数部分,浮点数有小数部分,表示的具体数字的个数相同 浮点数可以表示的范围比整数大 在任意区间内,存在无穷多个实数,所以计算机的浮点数不能表示区间内的所有的值,表示不精确,可以试着打印输出123456789; 通常浮点数只是实际值的近似值,7.0可能存储为浮点值6.999999 四、浮点数在计算机内部的存储 float 与double 类型的数据在计算机内部的表示方式相同,都分为:符号位(最高位),指数部和尾数部,因所占存储空间不同,故所能够表示的数值范围和精度不同; 类型 符号位 指数部 尾数部 float 1(第31位) 8(第23~30位) 23(0~22) double 1(第63位) 11(第52~62位) 52(0~51) 十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。 用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。 然后把取出的整数部分按顺序排列起来

Linux-标准字符设备

萝らか妹 提交于 2020-03-12 16:42:03
Linux-.标准字符设备 标准字符是内核对字符设备驱动的一种管理方式。 标准字符设备和早期字符、杂项字符设备本质上相同,都是对字符设备驱动的不同管理方式。 一个设备驱动,不管用早期字符设备、杂项字符设备、标准字符设备去管理,设备驱动功能没有任何区别! 标准字符设备是由早期字符设备拓展得到的,是由早期字符设备发展而来的,和早期字符设备80%相似! 标准字符设备的用途:主要在早期字符设备基础上,拓展了设备号的范围! 标准字符设备也可以用来管理一类类的设备! 特殊声明:标准字符设备的设备号分配比较灵活、自由! 3.1 标准字符设备的特性 字符设备具备三种核心属性:设备号、设备节点文件、文件操作集合 标准字符设备的设备号分布:u32 devnum = (major << 20) | minor; 主设备号: 0 ~ 2^12 次设备号: 0 ~ 2^20 设备节点文件: 标准字符设备注册成功之后,分配得到设备号。但是设备节点文件并不会自动创建,需要手动创建! 例: mknod /dev/led_hehe c major minor 文件操作集合: 所有设备驱动的文件操作集合完全相同。 3.2 标准字符设备结构体 标准字符设备结构体实质上和早期字符设备结构体一样! 标准字符设备结构体:struct cdev struct cdev { struct kobject kobj; struct

Redis List(3)

三世轮回 提交于 2020-03-12 09:16:47
存储类型 存储(实现)原理 在早期的版本中,数据量较小时用ziplist存储,达到临界值时转换为linkedlist进行存储,分别对应OBJ_ENCODING_ZIPLIST 和OBJ_ENCODING_LINKEDLIST。 3.2版本之后,统一用quicklist来存储。quicklist存储了一个双向链表,每个节点都是一个ziplist。 127.0.0.1:6379> lpush list a (integer) 1 127.0.0.1:6379> lpush list b c (integer) 3 127.0.0.1:6379> object encoding list "quicklist" quicklist quicklist(快速列表)是ziplist和linkedlist的结合体。 quicklist.h,head和tail指向双向列表的表头和表尾 /* quicklist is a 40 byte struct (on 64-bit systems) describing a quicklist. * 'count' is the number of total entries. * 'len' is the number of quicklist nodes. * 'compress' is: -1 if compression disabled,

C指针方面笔试题分享

て烟熏妆下的殇ゞ 提交于 2020-03-12 05:14:44
今天总结分享几个关于C语言指针方面的一些笔试题,主要是对前些日子练习的一些总结,同样也希望看到这篇文章的人,对你能有所帮助。如果有错误的部分,也希望即使指正 笔试题1. `int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }` 程序的运行结果是什么 首先,从这段代码中可以看到定义了一个长度为5的数组a,然后定义了一个指针ptr,将 ptr指向(int*)(&a+1),(&a+1)数组名取地址再加1,是跳过整个数组,指向a[4] 后面的地址,(int*)再将int(*)[5]类型的变量强转为int(*)类型,然后打印 *(a+1),数组名加1,在C语言中a将强制转换为a[0]的地址意味着数组的首元素地址向 后跳过一个元素即为a[1]的地址,在解引用打印数字为2,*(ptr-1)则是将ptr指针向前 跳过sizeof(int)个字节,在解引用,于是打印的结果回事a[4]中的数值,也就是5, 于是此题的答案则为2,5 笔试题2. struct Test { int Num ; char * pcName ; shortsDate ; char cha [ 2 ] ; shortsBa [ 4 ] ;

Redis Hash哈希(2)

断了今生、忘了曾经 提交于 2020-03-12 01:54:58
存储类型 包含键值对的无序散列表。value只能是字符串,不能嵌套其他类型。 同样是存储字符串,Hash与String的主要区别? 1、把所有相关的值聚集到一个key中,节省内存空间 2、只使用一个key,减少key冲突 3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU的消耗 Hash不适合的场景: 1、Field不能单独设置过期时间 2、没有bit操作 3、需要考虑数据量分布的问题(value值非常大的时候,无法分布到多个节点) 存储(实现)原理 Redis的Hash本身也是一个KV的结构,类似于Java中的HashMap。 外层的哈希(RedisKV的实现)只用到了hashtable。当存储hash数据类型时,我们把它叫做内层的哈希。内层的哈希底层可以使用两种数据结构实现: ziplist:OBJ_ENCODING_ZIPLIST(压缩列表) hashtable:OBJ_ENCODING_HT(哈希表) 执行命令 ziplist压缩列表 ziplist是一个经过特殊编码的双向链表,它不存储指向上一个链表节点和指向下一个链表节点的指针,而是存储上一个节点长度和当前节点长度,通过牺牲部分读写性能,来换取高效的内存空间利用率,是一种时间换空间的思想。只用在字段个数少,字段值小的场景里面。 ziplist的内部结构 ziplist.c源码第16行的注释:

VTK_Learning_交互与Widget_观察者/命令模式

▼魔方 西西 提交于 2020-03-11 12:50:23
1.前言 一个强大的可视化系统不仅需要强大的数据处理能力,也需要方便易用的交互功能。图形处理软件ParaView(hhttp://www.paraview.org)、德国癌症研究中心研发的MITK(http://www.mitk.org)等开源软件系统都提供了强大的交互功能,作为ParaView、MITK等软件构件基础的VTK同样也提供了各种各样的交互功能。 VTK的交互除了可以监听来自鼠标、键盘等外部设备的消息,还可以在渲染场景中生成功能各异的交互部件(Widget),用于控制可视化过程的参数,达到用户的渲染要求。 2.观察者/命令模式(Observe/Command) 观察者/命令模式是VTK里用的比较多的设计模式。 VTK中绝大多数的类都派生自vtkObject。查看类vtkObject的接口可以找到AddObserve()、RemoveObserve()、GetCommand()等函数。 观察者/命令模式是指一个Object可以有多个Observe,他定义了对象间的一种“一对多”的依赖关系, 当一个Object对象的状态发生改变时,所有依赖于它的Observe对象都得到通知而被自动更新。命令模式属于对象行为模式,他将一个请求封装为一个对象,并提供一致性发送请求的接口,当一个事件发生时,他不直接把事件传递给事件调用者,而是在命令和调用者之间增加一个中间者,讲这种直接关系切断

【BZOJ4917】Hash Killer IV 乱搞

被刻印的时光 ゝ 提交于 2020-03-11 05:41:06
【BZOJ4917】Hash Killer IV Description 有一天,tangjz造了一个Hash函数: unsigned int Hash(unsigned int v){ unsigned int t = v; t = t + (t << 10); t = t ^ (t >> 6); t = t + (t << 3); t = t ^ (t >> 11); t = t + (t << 16); return t; } 小Q发现这个函数非常不靠谱,对于任意的t,他可以随手构出个数字v使得Hash(v)=t。 小Q现在想考考你,他将给出Q个t,你需要构造出满足条件的v。 Input 第一行包含一个正整数Q(1<=Q<=100000),表示询问的个数。 接下来Q行,每行一个整数t(0<=t<2^32),表示询问的t。 输入数据保证对于每个t至少存在一组解。 Output 对于每组数据输出一行一个整数,即合法的v,若有多组可行解,输出任意一组。 Sample Input 4 614278301 1228622139 1841720774 2457244278 Sample Output 1 2 3 4 题解 :发现每个操作都是能反过来的。对于操作1,3,5,可以看成是原数*一个数,因为乘的是奇数而模数是偶数,所以反过来做的话直接乘逆元就行了。对于2,4操作,首先最高的6

【哈希】ELFHash

馋奶兔 提交于 2020-03-10 22:17:59
首先明确几点: 1.unsigned int为4个字节32位 2.异或操作中0是单位元,任何数与1异或相当于取反 3.unsigned无符号类型的数据右移操作均是执行逻辑右移(左高位自动补0) 4.ELFhash算法的核心在于“影响“ 先附上代码: unsigned int ELFhash(char *str) { unsigned int hash=0; unsigned int x=0; while(*str) { hash=(hash<<4)+*str; //1 if((x=hash & 0xf0000000)!=0) //2 { hash^=(x>>24); //影响5-8位,杂糅一次 3 hash&=~x; //清空高四位 4 } str++; //5 } return (hash & 0x7fffffff); //6 } int ELFHash(char *key) { unsigned long h=0; while(*key) { h=(h<<4)+(*key++); unsigned long g=h&0Xf0000000L; if(g) h^=g>>24; h&=~g; } return h%M; } 解释: 首先我们的hash结果是一个unsigned int类型的数据: 0000 0000 0000 0000 1.hash左移4位,将str插入