求二进制数中 1 的个数

不断清除 n 的二进制表示中最右边的 1,同时累加计数器,直至 n 为 0

运算次数与输入 n 的大小无关,只与 n 中 1 的个数有关

一个循环实现九九乘法表

1
2
3
4
5
6
7
8
9
1 x 1=1
2 x 1=2   2 x 2=4
3 x 1=3   3 x 2=6   3 x 3=9
4 x 1=4   4 x 2=8   4 x 3=12  4 x 4=16
5 x 1=5   5 x 2=10  5 x 3=15  5 x 4=20  5 x 5=25
6 x 1=6   6 x 2=12  6 x 3=18  6 x 4=24  6 x 5=30  6 x 6=36
7 x 1=7   7 x 2=14  7 x 3=21  7 x 4=28  7 x 5=35  7 x 6=42  7 x 7=49
8 x 1=8   8 x 2=16  8 x 3=24  8 x 4=32  8 x 5=40  8 x 6=48  8 x 7=56  8 x 8=64
9 x 1=9   9 x 2=18  9 x 3=27  9 x 4=36  9 x 5=45  9 x 6=54  9 x 7=63  9 x 8=72  9 x 9=81
像
11
21,22
31,32,33
41,42,43 ... 
这些数字的十位数和个位数相乘

非本地跳转 (NonLocal Jump)

函数内进行跳转,可以用 goto

但从一个函数内跳转到另一个函数的某处,goto 不能完成

setjmp 和 longjmp 用来完成这种类型的分支跳转,在处理异常上非常有用

wsl

install

https://aka.ms/wsl2kernel

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

1
2
3
4
5
6
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart

wsl --list --online

wsl.exe --install Ubuntu-22.04

原理

wsl1

subsystem

NT 架构中有 subsystem 概念,每个 subsystem 针对一个平台,ntdll.dll 是所有 subsystem 的基础

或者说 ntdll.dll 统一提供 NT 系统的 API 接口,subsystem 为各个平台的应用程序提供包装

go test - 模糊测试

series:

go fuzzing 通过持续给程序不同的输入来自动化测试,并通过分析代码覆盖率来智能的寻找失败的 case。这种方法可以尽可能的寻找到一些边缘 case,发现平时很难发现的问题

1.18 整合进标准库

模糊测试会监测程序运行过程中是否出现 panic、断言失败、无限循环等异常情况

go test - goconvey

series:

GoConvey 简介

GoConvey 网站 : https://smartystreets.github.io/goconvey

兼容 Go 内置 testing库,丰富的断言函数,彩色的控制台输出,提供命令行工具,更加直观的 Web 界面,测试会自动运行

1
go install github.com/smartystreets/goconvey@latest

运行 goconvey ,可以在本地运行一个强大 Web 图形界面,配合内置的 testing 使用,以提高开发效率

单元测试用例设计方法

单元测试的意义

  • 提高代码质量
  • 尽早发现问题: 问题发现的越早,解决问题的成本越低
  • 保证重构正确性: 随着功能的增加,重构几乎不可避免。很多时候我们不敢重构的原因就是担心其他模块因为依赖它而不工作。有了单元测试,只要在改完代码后运行一下单测就知道改动对整个系统影响了,从而可以让我们放心的重构代码
  • 简化调试过程: 单元测试让我们可以轻松的知道是哪一部分出了问题
  • 简化集成过程: 由于各个单元已经被测试,在集成过程中进行后续的测试会更容易
  • 优化代码设计: 编写测试用例会迫使开发人员仔细思考代码的设计和必须完成的工作,有利于开发人员加深对代码功能的理解,从而形成更合理的设计和结构
  • 单元测试就是最好的文档: 单元测试覆盖了接口的所有使用方法,是最好的示例代码。而真正的文档包括注释很有可能和代码不同步,并且看不懂

go test - 基准测试

series:

稳定的测试环境

性能测试受环境影响很大,为保证测试的可重复性,尽可能地保持测试环境的稳定

  • 机器处于闲置状态,测试时不要执行其他任务,也不要和其他人共享硬件资源
  • 机器是否关闭了节能模式,一般笔记本会默认打开这个模式,测试时关闭
  • 避免使用虚拟机和云主机进行测试,虚拟机和云主机 CPU 和内存一般会超分配,性能表现会非常地不稳定