好歹大了一岁了, 具体目标还是要有

希望22岁这一年继续好好学习, 读万卷书, 行万里路

同时警惕被物质化, 不能随波逐流, 不忘这一切的初衷

 

细化目标:

1. 继续坚持长跑和学习英语

2. 加强算法的学习, 有空多上OJ刷题, 强化编码功底和算法能[……]

阅读全文

一. 轮询

试想这样一种情形,  一个主线程中创建两个(多个)工作线程, 主线程需要等待一个或者多个工作线程执行结束.

比较直接的做法就是主线程中用一个循环, 每次都锁住和工作线程相同的一个互斥锁并检查是否有工作线程已经结束.

#include <stdio.h>
#inc[......]

阅读全文

前几天和一朋友聊到手机解锁, 朋友问我有没有想过手机pattern lock有多少种组合方式. 其实这个问题早就想过了, 以前感觉会有很多种特殊情况, 用程序解还不如用排列组合来得快

后来讨论了下, 就决定把问题简化: 只考虑4个点或4个点以上的情形, 并且包含下图这种路径的不算有效的组合方式
lock[……]

阅读全文

背景: sleep函数会将进程投入睡眠, 直到被时钟中断唤醒. 而”睡眠”这个状态含义是进程不在CPU上运行, 并不是 CPU 投入”睡眠”, 当时钟中断到来时经过进程调度重新将 CPU 让给之前睡眠的进程

那么问题就来了, 如果一个系统中每个进程都主动或者被动进入睡眠状态, 比如10个进程都[……]

阅读全文

一. 最近邻插值

这是最简单的插值办法, 为了方便描述, 先考虑一维的情况:

最近邻插值将连续坐标x近似为最近的整数u0, 输出值g_out(x) = g_in(u0) , 其中u0 = round(x)

假设给定一个输入 123, 60, 255 长度为3, 那么每个点对应的坐标分别是0, 1[……]

阅读全文

一. 首先看看默认情况下是如何对齐

IA32:

无论数据是否对齐, IA32硬件都能正确工作, 不过, Intel还是建议要求对齐数据以提高存储器系统的性能. Linux沿用的对齐策略是, 2字节数据类型 (例如 short) 的地址必须是2的倍数, 而较大的数据类型 (例如 int, int *[……]

阅读全文

曾经一直好奇c编译器如何做的类型转换, 最近研究了几天, 有了个大概的了解, 这里做个总结:

一.整型间转换

整型间的转换比较简单, 如果字长变化, 只需进行扩展或者截断

这方面gcc和msvc编译器做法大同小异, 就不分开讨论了, 就以gcc为例

1. 扩展:

比如int8到int32的扩展,[……]

阅读全文

前段时间看了下glibc的一些string库函数实现

自己照猫画虎的写了几个函数测了测, 比起windows vc中自带的实现, 并没有更快, 反倒是慢了很多.

比如memset函数, 微软公开的vc crt中memset.c是以字节为单位循环的.  如果用glibc中操作块与循环展开[……]

阅读全文

近来打算阅读glibc源码, 便从最简单的string.h开始. 说道string库, 第一个想到的是什么函数? 当然是strlen

于是翻开strlen.c , 大牛写的代码就是不一样, 总像是故意把原本简单的东西写得复杂, 仔细阅读才发现简直是神作.

对任何c程序员来说以下代码可以说是信手拈[……]

阅读全文

这个问题一开始源于用vc编译一个utf8文件, 遇到了错误error C2001: 常量中有换行符

原本是个mingw下写的程序, gcc编译时没问题的, 后来网上搜了下, 说是因为vc对无bom的utf8文件支持不太好, 得加上bom才能正常编译
在vc上面测试以下代码

#include &lt[......]

阅读全文

我们可以定义一些最基本的计算,比如加减乘除、移位等,然后通过对基本计算进行高阶组合,形成更复杂的计算,比如幂、开方、阶乘等等

而计算机中除了基本的计算,还有基本的控制指令,比如循环、判断、递归、函数调用等

当具备这些特性后,我们就可以用他们进行组合,模拟出一个高阶的机器

比如我们可[……]

阅读全文