字节-2.位运算

目录

位运算

原码/反码/补码

掩码


位运算

按位与 &:同时为1,结果才为1。101 & 100 = 100

按位或 |:有一个为1,结果就为1。101 | 100 = 101

按位异或 ^:相同为0,不同为1。101^100 = 001

按位取反 ~:~100 = 011

左移<<:左移 n 位相当于 × 2^n,前提是不会发生溢出

右移>>:右移 n 位,等价于 ÷ 2^n,前提是不会发生溢出

cpp 复制代码
uint8_t A1 = 0x41;

// 0x41>>4 = 0x04,&0x0F确保只取4位,其他都0
uint8_t color_code = (A1 >> 4) & 0x0F; 

原码/反码/补码

在有符号数表示中,最高位表示符号位,其中 0 代表正数,1 代表负数。

正数的补码等于原码,负数的补码是 "反码 + 1"

如十进制:52,对应二进制:0011 0100。但-52并不是1011 0100。而是以补码形成存在。因为计算机处理减法,远没有加法那么方便。计算机用 "补码" 表示负数,就能让减法运算可以转化为加法运算。

-52的补码是1100 1100,计算过程如下:

原码:52 -> 0011 0100

原码所有位取反,得到反码:0011 0100 -> 1100 1011

反码加1得到补码:1100 1011+1 -> 1100 1100

所以52 - 52 = 52 +(-52)= 原码+补码 = 0011 0100+1100 1100 = 1 0000 0000

因为最大只有8位,所以最高位1会被溢出,即最终结果为0000 0000,也就是0。

掩码

掩码(Mask):根据位与运算符的特性,就能通过掩码来实现 "获取二进制数指定位的值"。

cpp 复制代码
unsigned char status = 0b10100101;
unsigned char mask = 0b00000100;
// 10100101 & 00000100 = 00000100 => 4
printf("%d\n", status & mask);   

在OpenCV中,可以通过掩码来获取感兴趣的区域。

和位与运算符的功能不同,位与运算符可以实现 "获取二进制数指定位的值",而根据位或运算符的特性,它实现的则是 "给二进制数的指定位置 1(无论原来是否是 1)"。通常可以用位或来拼接数据。

相关推荐
三水不滴8 小时前
计网:输入网址到网页显示
经验分享·笔记·计算机网络
CS创新实验室21 小时前
《计算机网络》深入学:从自治系统内部到全球互联
计算机网络·考研·智能路由器·协议·408
小李独爱秋1 天前
计算机网络经典问题透视:蜂窝网络切换如何“扼杀”你的TCP连接?
网络·网络协议·tcp/ip·计算机网络·php·信息与通信
三水不滴1 天前
计算机网络核心网络模型
经验分享·笔记·tcp/ip·计算机网络·http·https
工程师0071 天前
计算机网络知识(一)
运维·服务器·计算机网络
梁辰兴2 天前
计算机网络基础:TCP 的拥塞控制
tcp/ip·计算机网络·php·tcp·拥塞控制·计算机网络基础·梁辰兴
小李独爱秋2 天前
计算机网络经典问题透视:如何探知无线AP的SSID与BSSID?
网络协议·计算机网络·wireshark·信息与通信
小李独爱秋2 天前
计算机网络经典问题透视:无线个人区域网WPAN的主要特点是什么?
计算机网络·网络安全·信息与通信·信号处理·wpan
Hubianji_092 天前
[IOS]2026年网络安全、通信技术与计算机科学国际会议(ACCTCS 2026)
计算机网络·安全·web安全·ios·国际会议·国际期刊
崎岖Qiu2 天前
【计算机网络 | 第一篇】计算机网络概述
笔记·学习·计算机网络