惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
MyScale Blog
MyScale Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
N
Netflix TechBlog - Medium
MongoDB | Blog
MongoDB | Blog
I
InfoQ
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Help Net Security

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例)
C语言的位操作
2016-02-06 · via Jiajun的技术笔记

以下所有都是针对64位机来说的.

bit

一个byte占8个bit,对于bit的操作就是位运算.

左移,在bit级别对一个数整体向左移动,在右边用0填充. 例如对一个整数1,二进制表示为 1, 向左移动一个bit,二进制就变成了10, 也就是十进制的2,再向左移一位, 二进制变成了100, 对应的十进制数是4, 对于左移运算, 移动n位相当于原数 乘以2的n次方, 但是如果溢出的话, 结果就不是理想情况中的结果了.

对于右移, 把原有的位移动以后, 有两种填充方式. 一种是在左边填补原来最高位的值, 这称为算术右移, 另一种方式是填补0, 称为逻辑右移.

.. code:: java

$ cat Test.java
class Test {
    public static void main(String[] args) {
        int i = -10;
        System.out.println(i<<1);
        System.out.println(i>>1);
        System.out.println(i>>>1);
    }
}
$ javac Test.java && java Test
-20
-5
2147483643

>>> 是逻辑运算, 在左边填充了大把的0, 所以补码认为这是正数, 而算术右移保持 了算术上的正确性, 于是就有了上面的结果.

用位运算优化

cpu计算乘法很慢,原因是对于一个m位乘以n位的运算,要计算O(m * n)次, 而对于加法, 只要计算O(max(m,n))次.

所以,可以利用左移来优化乘法, 例如 11*12, 可以变成 11 * (2^3 + 2^2), 就是 11 << 3 + 11 << 2 , 便会大幅度提高运算速度.