请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: ID紫麒麟

紫麒麟笔记_1杂乱

[复制链接]

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
发表于 2017-3-7 20:15:51 | 显示全部楼层
本帖最后由 000 于 2017-3-7 21:36 编辑

这样子的?
  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #define __MOD(x,y) ((x) - ((int)(x)/(y))*(y))
  5. int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  6. BOOL IsLeapYear(const int iYear)
  7. {
  8.         if (!__MOD(iYear,100))
  9.                 if (!__MOD(iYear , 400))
  10.                         return 1;
  11.                 else
  12.                         return 0;
  13.         else if (!__MOD(iYear,4))
  14.                 return 1;
  15.         else
  16.                 return 0;
  17. }
  18. SYSTEMTIME AddThreeMon(SYSTEMTIME time)
  19. {
  20.         if ((time.wMonth += 3) > 12)
  21.         {
  22.                 time.wMonth -= 12;
  23.                 ++time.wYear;
  24.         }
  25.         if (IsLeapYear(time.wYear))
  26.                 ++day[2 - 1];
  27.         if (time.wDay > day[time.wMonth - 1])
  28.         {
  29.                 time.wDay -= day[time.wMonth - 1];
  30.                 ++time.wMonth;
  31.         }
  32.         return time;
  33. }
  34. int _tmain(int argc,TCHAR *argv[])
  35. {
  36.         SYSTEMTIME time_now;
  37.         GetLocalTime(&time_now);
  38.         printf("Now Time IS: %4d,%2d,%2d\n",
  39.                 time_now.wYear,
  40.                 time_now.wMonth,
  41.                 time_now.wDay);
  42.         time_now = AddThreeMon(time_now);
  43.         printf("After three mounth Time IS: %4d,%2d,%2d\n",
  44.                 time_now.wYear,
  45.                 time_now.wMonth,
  46.                 time_now.wDay);
  47.         return 0;
  48. }
复制代码


回复 支持 反对

使用道具 举报

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
发表于 2017-3-7 20:22:23 | 显示全部楼层
如果要节省函数跳转时间可以加"inline"抛出GetLocalTime函数消耗的时间,这个算法的时间复杂度应该是线性的,站长,你说这个分析的对不对?
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-3-10 17:43:03 | 显示全部楼层
000 发表于 2017-3-7 20:22
如果要节省函数跳转时间可以加"inline"抛出GetLocalTime函数消耗的时间,这个算法的时间复杂度应该是线性的 ...

呀?一直以来都是我自己记录一些东西,现在你竟然还真的去写一些东西,今天没具体的时间了,有空我看看你的实现。

因为以前搞过加密解密的东西,今天随口提一个比较简单的加密解密的东西吧,tea加密,代码不多,也不复杂。听说QQ就是以tea16做一些加密解密,也不知道真假。

另外搞两个算法的东西,有空自己看看:
http://blog.csdn.net/ljj583905183/article/details/40937021

http://www.cppblog.com/expter/archive/2015/05/28/108977.html
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-3-13 17:37:44 | 显示全部楼层
四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-3-13 17:38:25 | 显示全部楼层
1,防止一个头文件被重复包含
#ifndef BODYDEF_H
#define BODYDEF_H
  //头文件内容
#endif
2,得到指定地址上的一个字节或字
#define  MEM_B( x )  ( *( (byte *) (x) ) )
#define  MEM_W( x )  ( *( (word *) (x) ) )
3,得到一个field在结构体(struct)中的偏移量
#define FPOS( type, field ) ( (dword) &(( type *) 0)-> field )
4,得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
5,得到一个变量的地址(word宽度)
#define  B_PTR( var )  ( (byte *) (void *) &(var) )
#define  W_PTR( var )  ( (word *) (void *) &(var) )
6,将一个字母转换为大写
#define  UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )
7,判断字符是不是10进值的数字
#define  DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')
8,判断字符是不是16进值的数字
#define  HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )
9,防止溢出的一个方法
#define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))
10,返回数组元素的个数
#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )
11,使用一些宏跟踪调试
ANSI标准说明了五个预定义的宏名。它们是:
_LINE_ (两个下划线),对应%d
_FILE_     对应%s
_DATE_   对应%s
_TIME_    对应%s
_STDC_


宏中"#"和"##"的用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
Printf(STR(vck));           // 输出字符串"vck"
printf("%d\n", CONS(2,3));  // 2e3 输出:2000

当宏参数是另一个宏的时候
需要注意的是凡宏定义里有用"#"或"##"的地方宏参数是不会再展开.
#define A          (2)
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
printf("%s\n", CONS(A, A));               // compile error  
这一行则是:
printf("%s\n", int(AeA));
INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏.
加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数
#define STR(s)      _STR(s)          // 转换宏
#define CONS(a,b)   _CONS(a,b)       // 转换宏
printf("int max: %s\n", STR(INT_MAX));          // INT_MAX,int型的最大值,为一个变量 #include<climits>
输出为: int max: 0x7fffffff
STR(INT_MAX) -->  _STR(0x7fffffff) 然后再转换成字符串;

printf("%d\n", CONS(A, A));
输出为:200
CONS(A, A)  -->  _CONS((2), (2))  --> int((2)e(2))

"#"和"##"的一些应用特例
1、合并匿名变量名
#define  ___ANONYMOUS1(type, var, line)  type  var##line
#define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line)
#define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__)
例:ANONYMOUS(static int);  即: static int _anonymous70;  70表示该行行号;
第一层:ANONYMOUS(static int);  -->  __ANONYMOUS0(static int, __LINE__);
第二层:                        -->  ___ANONYMOUS1(static int, _anonymous, 70);
第三层:                        -->  static int  _anonymous70;
即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;

2、填充结构
#define  FILL(a)   {a, #a}

enum IDD{OPEN, CLOSE};
typedef struct MSG{
  IDD id;
  const char * msg;
}MSG;

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
相当于:
MSG _msg[] = {{OPEN, "OPEN"},
              {CLOSE, "CLOSE"}};

3、记录文件名
#define  _GET_FILE_NAME(f)   #f
#define  GET_FILE_NAME(f)    _GET_FILE_NAME(f)
static char  FILE_NAME[] = GET_FILE_NAME(__FILE__);

4、得到一个数值类型所对应的字符串缓冲大小
#define  _TYPE_BUF_SIZE(type)  sizeof #type
#define  TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type)
char     buf[TYPE_BUF_SIZE(INT_MAX)];
     -->  char  buf[_TYPE_BUF_SIZE(0x7fffffff)];
     -->  char  buf[sizeof "0x7fffffff"];
这里相当于:
char  buf[11];
回复 支持 反对

使用道具 举报

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
发表于 2017-3-18 16:50:31 | 显示全部楼层
ID紫麒麟 发表于 2017-3-13 17:38
1,防止一个头文件被重复包含
#ifndef BODYDEF_H
#define BODYDEF_H

我来做个补充吧,关于防止重复包含的,现在C11吧,有个#pragma once
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-3-23 14:19:44 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-4-5 11:09 编辑

(((n-0x0101010101010101) & (~n)) & 0x8080808080808080)

这个东西挺有意思的,不过这个东西太细节了,如果真正用到,拿来用就好,知道原理就够了。


本来是我以前笔记里面的一个东西,里面有解释,我今天又去搜索了一下,发现这个东西不好搜索到有用的东西。就在笔记中找了一些关键字搜索了。

现在贴出来能够在网上找到解释我说这个东西有意思的地方:

  • size_t strlen1(const char *str)
  • {
  •     const char *p = str;
  •     while(*p) p ++;
  •     return (size_t)(p - str);
  • }
  • size_t strlen2(const char *str)
  • {
  •     unsigned v;
  •     const char *p = str;
  •     while(*p && ((unsigned)p & 3))
  •         p ++;
  •     if (*p == 0)
  •         return (size_t)(p - str);
  •     for (v = 0; !v; p += 4)
  •     {
  •         v = (*(unsigned*)p - 0x01010101) & 0x80808080;  
  •         if (v)
  •             v &= ~*(unsigned*)p;
  •     }
  •     for (; (v & 0xff) == 0; p ++)
  •         v >>= 8;
  •     return (size_t)(p - str - 4);
  • }



(((n-0x01010101) & (~n)) & 0x80808080)
我想上面这一行红色的部分应该能够百度到东西,我的笔记里面有一个扩展:
说是找字符串中特定的字符的时候的做法,比如寻找0x41
是不是n=x-0x41414141
能够明白道理的人应该懂

本来这里有个坑,不想写出来的,但是想起来网站管理员说这个帖子可能会结贴,我就还是填上吧。。。

n = x - 0x41414141 真的管用么?
假设x = 0x41000000
n会等于几?
是否能够寻找出0x41呢?

说真的,笔记随笔很有可能一年后再看会发现不同的东西。特别是那些自己写出来的东西。如果深入思考(((n-0x0101010101010101) & (~n)) & 0x8080808080808080)这个东西的原理,是不是能够寻找到在一个uint64_t中寻找是否有字节为0x41的方法呢?


说实话,这样写代码不简洁,但是在字符串比较长的时候真的会加快运行速度的。




















回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-3-30 11:05:52 | 显示全部楼层
目前的形势就是:IO密集型的程序大行其道,CPU密集型的程序衰落,所以现在很多都追求开发速度,而c/c++就显得没落了。

GPU并行运算也是卡在IO上面,觉得真正cpu密集型的方向还真的不是那么多了呀。
回复 支持 反对

使用道具 举报

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
发表于 2017-4-3 19:37:11 | 显示全部楼层
看看你写的东西,对我帮助很大 !
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-13 11:42:02 | 显示全部楼层
000 发表于 2017-4-3 19:37
看看你写的东西,对我帮助很大 !

谢谢哈,都是一些零散的东西,还有就是有时候临时想写点儿东西就寥寥几笔。

这些都是一些比较细小,细节的东西而已,真正解决问题,可能更多的是看完整的搞搞项目挺好的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-8-19 07:17 , Processed in 0.156250 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表