位操作专题

位操作(Bitwise Operation)

位操作(Bitwise Operation)是一种直接对整数的二进制位进行操作的计算方法。在计算机中,数据通常以二进制形式存储,位操作允许我们直接操作这些二进制位。位操作通常比常规的算术运算更高效,因为它们直接作用于二进制位而不涉及更复杂的计算。 常见的位操作符 1.按位与(&): 对应位都为1时,结果为1,否则为0。 例如:1010 & 1100 = 1000 2.按位或(|): 只要对应

关于位结构体及位操作总结

#include <stdio.h>#pragma pack(1)struct stu{char a:4; // a占用char的低4位 char b:4; // b占用char的高4位(注意,这里实际上是与a共享同一个char的空间) };#pragma pack(4)int main(){struct stu s={.a=2, //a:0010.b=3, //b:00

使用位操作高效解决单个元素出现问题【位运算】

使用位操作高效解决单个元素出现问题 在日常的算法面试和编程挑战中,常常会遇到寻找单个出现元素的问题。尽管可以用哈希表(map)轻松解决,但要求更高效的线性时间复杂度和常量空间复杂度时,位操作特别是异或(XOR)运算提供了一个巧妙的解决方案。本篇博客将深入探讨这个问题,详细解释异或运算的特性,并展示其在解决该类问题中的强大作用。 问题描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其

AWTK fscript 中的位操作扩展函数

fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 位操作扩展函数 位操作扩展函数 1. & 位与运算。 原型 n1 & n2 示例 print(1 & 1) 2. | 位或运算。 原型 n1 | n2 示例 print(|(1, 2))

【Rust光年纪】深度剖析:Rust库探秘,从位操作到全文搜索

从位操作到全文搜索:探索Rust编程世界的精华库 前言 Rust作为一门现代化、安全性高的系统编程语言,拥有丰富多样的库和工具生态系统。本文将重点介绍几个在Rust语言中广受欢迎的库,它们分别用于处理位标志、位数组、布隆过滤器、Roaring Bitmaps、嵌入式数据库和全文搜索引擎功能。 欢迎订阅专栏:Rust光年纪 文章目录 从位操作到全文搜索:探索Rust编程世界的精

位操作实现加减乘除四则运算

常见的位操作实现 1. 常用的一个等式:-n = ~(n - 1) = ~n + 1 2. 获取整数的二进制的最右边的1:n & (-n) 或 n & ~(n - 1)。例如 n = 010100, -n = 101100,那么n & (-n) = 000100 3. 去除整数的二进制的最右边的1:n & (n - 1)。例如 n = 010100,n-1 = 010011,n&(n-1)

【位操作笔记】计算整数的绝对值 3

计算整数的绝对值(integer absolute) 3 用于计算整数的绝对值,不使用分支判断。 算法说明 CPU表示有符号数的是使用补码(two’s complement),正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1。 如果CPU表示有符号数使用的是反码(one’s complement),则该算法无效。 因为是使用补码(two’s complement),所以

【位操作笔记】计算整数的绝对值 2

计算整数的绝对值(integer absolute) 2 用于计算整数的绝对值,不使用分支判断。 算法说明 该算法利用CPU表示有符号数的是使用补码(two’s complement),正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1。 如果CPU表示有符号数使用的是反码(one’s complement),则该算法无效。 因为是使用补码(two’s complemen

【位操作笔记】判断两个整数的符号位是否相反

判断两个整数的符号位是否相反 判断两个整数的符号位是否相反,也就是两个数是否一个是正数,一个是负数。 算法说明 该算法通过异或的结果大小来判断两个整数的符号位是否相反。 实现代码 bool Detect_opposite_signs(int x, int y){return ((x ^ y) < 0);} 算法计算过程 第一步,x ^ y,两个整数先进行异或。 第二步,判断异

【位操作笔记】计算整数的绝对值 1

计算整数的绝对值(integer absolute) 1 用于计算整数的绝对值,不使用分支判断。 算法说明 该算法利用CPU表示有符号数的是使用补码(two’s complement),正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1。 如果CPU表示有符号数使用的是反码(one’s complement),则该算法无效。 有符号数右移,正数高位补0,负数高位补1,例如

【位操作笔记】计算奇偶性 异或和右移查表法

计算奇偶性(Compute parity) 异或和右移查表法 计算奇偶性(Compute parity)指的是,计算一个数所包含1的个数是奇数还是偶数,例如一个8位数0x5b = 0b‭0101 1011‬,其中1的个数为5,是奇数;一个8位数0xa3 = 0b‭‭1010 0011‬,其中1的个数为4,是偶数。该算法可以用于奇偶校验位的计算与验证。 算法说明 先通过移位和位移,将32位数值

【位操作笔记】计算奇偶性 使用乘法

计算奇偶性(Compute parity) 使用乘法 计算奇偶性(Compute parity)指的是,计算一个数所包含1的个数是奇数还是偶数,例如一个8位数0x5b = 0b‭0101 1011‬,其中1的个数为5,是奇数;一个8位数0xa3 = 0b‭‭1010 0011‬,其中1的个数为4,是偶数。该算法可以用于奇偶校验位的计算与验证。 算法说明 使用乘法运算,仅在8次运算中计算32位

【位操作笔记】计算奇偶性 使用64位乘法和模除的方法

计算奇偶性(Compute parity) 使用64位乘法和模除的方法 计算奇偶性(Compute parity)指的是,计算一个数所包含1的个数是奇数还是偶数,例如一个8位数0x5b = 0b‭0101 1011‬,其中1的个数为5,是奇数;一个8位数0xa3 = 0b‭‭1010 0011‬,其中1的个数为4,是偶数。该算法可以用于奇偶校验位的计算与验证。 算法说明 使用64位乘法和模除

【位操作笔记】计算奇偶性 查表法

计算奇偶性(Compute parity) 查表法 计算奇偶性(Compute parity)指的是,计算一个数所包含1的个数是奇数还是偶数,例如一个8位数0x5b = 0b‭0101 1011‬,其中1的个数为5,是奇数;一个8位数0xa3 = 0b‭‭1010 0011‬,其中1的个数为4,是偶数。该算法可以用于奇偶校验位的计算与验证。 算法说明 使用查表法判断一个数所包含1的个数是奇数

【位操作笔记】位合并 通过掩码

位合并(Merge bits) 通过掩码 通过掩码把两个数进行位合并。例如一个数为0x23,另一个数为0x65,假设合并的数要取第一个数的高4位,第二个数的低4位,那么合并后的数就是0x25。 算法说明 该算法使用了异或来实现,比普通的实现方式节省一次操作。 实现代码 non_masked_val和masked_val是两个要进行合并的数,mask是掩码。 non_masked_val

【位操作笔记】位合并 普通方式

位合并(Merge bits) 普通方式 通过掩码把两个数进行位合并。例如一个数为0x23,另一个数为0x65,假设合并的数要取第一个数的高4位,第二个数的低4位,那么合并后的数就是0x25。 算法说明 该算法通过先与掩码,再进行或操作完成。 实现代码 non_masked_val和masked_val是两个要进行合并的数,mask是掩码。 non_masked_val是合并非掩码位,

位操作基础

一、位的概念      我们知道,在计算机中,一字节占8位(现在的某些电脑也有占16位的),这样表示的数的范围为0-255,      也即00000000-11111111。位就是里面的0和1。          char c=100;      实际上c应该是01100100,正好是64H。其中高位在前,低位在后。                   |       |

C语言中位操作

一、基本位操作 <table border="0" cellspacing="0" cellpadding="2" width="402" unselectable="." "="" style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; font-size: 12px; line-heig

位操作杂记

有六个位操作符,他们是: & 按位与 |   按位或 ^  按位异 ~  按位求反 >>  右移 ,这里需要注意的是数据整体的移动不是某一位的移动 <<  左移 ,  这里需要注意的是数据整体的移动不是某一位的移动 例如: 1<<3   就是二进制数00001左移3位成为:01000 3<<3  就是二进制数00011左移3位成为:11000 自己的错误认识是只能对单个位进行移位,这样我们在

【进程等待】waitpid的参数pid | status的位图位操作WIFEXITEDWEXITSTATUS宏

目录 waitpid pid status status位图  status按位操作 输入型参数和输入型参数  宏WIFEXITED&WEXITSTATUS options&非阻塞等待 上篇进程等待我们介绍到怎样去进程等待。我们介绍了wait函数&阻塞等待。本篇我们将介绍waitpid函数的参数pid和status。 waitpid man 2 waitpid等待一个进

Java逻辑与位操作

逻辑位与a&b 不短路 a&&b 短路 a&b或a|b 不短路 a||b 短路a|b异或a^ba^b非!a~a

奶牛合作 对于位操作的敏感

有n( <= 50)头奶牛,每头奶牛都有一个编号(<1048576),把他们分成警察和小偷两队(不能有一队为空),如果两队的合作指数相同,那么就是合法的方案(合作指数是指该队成员的编号进行and操作的结果)(限时2000ms)。 首先比较敏感的就是编号不算大,是2的20次方,还有就是and操作的结果只和0的个数有关系,如果某位有一个0,那么结果必然是0。所以对每一位进行考虑(指的是将数字转成二进

LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析可视化:企业实战案例 python源码解读 程序员必备的数学知识与应用 备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉

[LeetCode] 一些位操作类的算法

1. 出处 找列表中唯一出现一次的元素 汉明重量/数1出现的次数 汉明距离 2. 说明 2.1 基本规则 从二进制数开始分析有一些有趣的基本操作: 乘2: 右移动1位除2: 左移1位0 & 0 = 0, 1 & 0 = 0, 1 & 1 = 0,这个用来处理数1出现的位数,后边会写0 ^ 0 = 0, 1 ^ 0 = 1, 1 ^ 1 = 0 ,只要位不相同就为1,这里用来数唯

STM32的位操作(相当于51单片机的sbit)

经过一段时间的学习,今天发现STM32的单个端口都有一个32位的地址,这样就可以把这个地址给找出来,进行单个位的操作了,这也没有什么好说的,直接复制粘贴就好了,用到的时候过来复制直接使用就行了。虽然看着挺多的起始最后就是得到一个地址而已: #define GPIOA_ODR_Addr (GPIOA_BASE + 0x0C) //想用哪个GPIO就改成ABCDEF,可以是ODR也