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

推荐订阅源

A
About on SuperTechFans
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
宝玉的分享
宝玉的分享
美团技术团队
量子位
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
爱范儿
爱范儿
J
Java Code Geeks
博客园 - Franky
Last Week in AI
Last Week in AI
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
GbyAI
GbyAI
Recent Announcements
Recent Announcements
小众软件
小众软件
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
Python的位运算符与移位运算符 - 少数派
2023-07-18 · via 少数派

在学习这篇文章的时候,遇到了一个关于位运算符的概念,想要弄清楚,所以就去查了一下资料。下面是具体的内容。

一、位运算符

按位与(AND):

a = 10  # 二进制表示为 1010
b = 6   # 二进制表示为 0110
result = a & b
print(result)  # 输出 2,二进制表示为 001

这里的计算是按位与运算符(&)进行的。按位与运算的规则是,对于两个操作数的每个对应位,只有当两个位上的值都为 1 时,结果的对应位才为 1。否则,结果的对应位为 0。

让我们逐位对 ab 进行按位与运算来计算结果:

   a:  1  0  1  0    (二进制)
   b:  0  1  1  0    (二进制)
------------------
result:  0  0  1  0    (二进制)

通过对每个对应位进行按位与运算,得到结果 0010,它的十进制表示为 2。

因此,result 的值是 2,二进制表示为 0010


按位或(OR):

a = 10  # 二进制表示为 1010
b = 6   # 二进制表示为 0110
result = a | b
print(result)  # 输出 14,二进制表示为 1110

这里的计算是按位或运算符(|)进行的。按位或运算的规则是,对于两个操作数的每个对应位,只要有一个位上的值为 1,结果的对应位就为 1。否则,结果的对应位为 0。

让我们逐位对 ab 进行按位或运算来计算结果:

   a:  1  0  1  0    (二进制)
   b:  0  1  1  0    (二进制)
------------------
result:  1  1  1  0    (二进制)

通过对每个对应位进行按位或运算,得到结果 1110,它的十进制表示为 14。

因此,result 的值是 14,二进制表示为 1110


按位异或(XOR):

a = 10  # 二进制表示为 1010
b = 6   # 二进制表示为 0110
result = a ^ b
print(result)  # 输出 12,二进制表示为 1100

这里的计算是按位异或运算符(^)进行的。按位异或运算的规则是,对于两个操作数的每个对应位,只有当两个位上的值不相同时,结果的对应位才为 1。如果两个位上的值相同,则结果的对应位为 0。

让我们逐位对 ab 进行按位异或运算来计算结果:

   a:  1  0  1  0    (二进制)
   b:  0  1  1  0    (二进制)
------------------
result:  1  1  0  0    (二进制)

通过对每个对应位进行按位异或运算,得到结果 1100,它的十进制表示为 12。

因此,result 的值是 12,二进制表示为 1100


按位取反(NOT):

a = 10  # 二进制表示为 1010
result = ~a
print(result)  # 输出 -11,二进制表示为 -1011(根据二进制补码表示)

按位取反运算符(~)是一元运算符,用于对操作数的每个位执行逻辑非操作,即将每个位上的 0 改为 1,将每个位上的 1 改为 0。

在上述示例中,a 的二进制表示是 1010。应用按位取反运算符后,对每个位执行逻辑非操作:

   a:  1  0  1  0    (二进制)
------------------
result:  0  1  0  1    (二进制)

结果得到 0101,但需要注意的是,这个结果并不是直接的二进制表示。在大多数计算机中,负数使用二进制补码表示。所以,在这个例子中,我们得到的是补码 0101,它的补码形式就是 -1011。因此,result 的值是 -11,二进制补码表示为 -1011

按位取反运算符可以用于反转整数的所有位,包括符号位。但结果的解释取决于具体的编程语言和系统。在大多数情况下,结果会以补码形式表示。


二、移位运算符

左移运算符(<<):

a = 10  # 二进制表示为 1010
result = a << 2
print(result)  # 输出 40,二进制表示为 101000

左移运算符(<<)将二进制数的各个位向左移动指定的位数,并在右侧用零填充空位。左移运算的结果相当于将原数乘以 2 的移位次数。

在上述示例中,我们有一个变量 a,它的二进制表示是 1010。我们将使用左移运算符将 a 左移 2 位。

我们可以按位对 a 进行左移操作,并在右侧用零填充空位:

   a:  1  0  1  0    (二进制)
------------------
result:  1  0  1  0  0  0    (二进制)

通过左移操作,我们得到了 101000。这个结果的十进制表示为 40

因此,将变量 a 左移 2 位后,我们得到了结果 40,二进制表示为 101000

左移运算符可以将二进制数向左移动,并在右侧用零填充空位,相当于将原数乘以 2 的移位次数。


右移运算符(>>):

a = 10  # 二进制表示为 1010
result = a >> 2
print(result)  # 输出 2,二进制表示为 10

右移运算符(>>)将二进制数的各个位向右移动指定的位数。对于有符号数,使用算术右移,即保留符号位。对于无符号数,使用逻辑右移,即在左侧用零填充空位。右移运算的结果相当于将原数除以 2 的移位次数。

在上述示例中,我们有一个变量 a,它的二进制表示是 1010。我们将使用右移运算符将 a 右移 2 位。

我们可以按位对 a 进行右移操作:

   a:  1  0  1  0    (二进制)
------------------
result:  1  0    (二进制)

通过右移操作,我们得到了 10。这个结果的十进制表示为 2

因此,将变量 a 右移 2 位后,我们得到了结果 2,二进制表示为 10

右移运算符可以将二进制数向右移动,对于有符号数会保留符号位,对于无符号数会在左侧用零填充空位,相当于将原数除以 2 的移位次数。

当对一个二进制数进行右移操作时,最右边的位将被丢弃并且被移出。右移操作会将所有位向右移动指定的位数,并在左侧用零填充空位。

   a:  1  1  1  0  1  0    (二进制)
------------------
result:  1  1  1  0    (二进制)