引言
博主不是计算机专业的,码代码也只是项目里面会用到才去单独学一点。我以前些python的。最近学习点云操作的时候需要用到C++,于是就把多年没用的C++捡起来重新复习了一下。对于位运算,以前从来没用到过这个东西,都快忘光了,今天捡起来写一些笔记加深一下印象。
位运算作用
先简单说一下位运算的作用,这个东西以前我学习的时候完全不知道这玩意儿有什么用,现在发现这个运算能提高算法的速度。
简单举个例子,不想看的可以跳过这一段,我只是因为正好项目里用到才记录一下。
一种常见的点云算法是体素格网法(Voxel Grid),它用于将不规则采样的点云数据转换为规则矩阵网格。在体素格网法中,可以将点云空间分割为固定大小的立方体体素。对于每个体素,可以计算它所包含的点云的质心和协方差矩阵。这些计算通常需要对点云中的每个点进行迭代,并对所有点进行组合计算,这在处理大量点云数据时会非常缓慢。
此时,可以使用位运算来快速计算体素内的点云。具体地说,可以使用两个位图分别表示体素内的点云和体素网格,其中体素内的点云位图将每个点映射到一个位,而体素网格位图将每个体素映射到一个位。然后,可以使用按位与运算符来找到哪些位既在体素内的点云位图中,也在体素网格位图中设置了。这些位对应于位于该体素内的点,可以用于计算该体素的质心和协方差矩阵,而无需迭代整个点云数据集。(可能位运算还有其他的作用,网上查了一下还有创建掩码什么的,跟我的领域没关系,我暂时就只知道这些)
位运算符的描述
就是以下这几位
(&,|,~,^,<<,>>)
按位与&
&:官方名按位与, 按位与是一种逐位比较两个二进制数的操作,只有两个二进制数对应位都为1时,结果才为1,否则结果为0。
举个例子:
a = 10101111, b = 11011010,c = a & b
那么c 就是10001010,也就是将 a 和 b 分别表示为二进制数后,逐位比较后得到的结果。
按位或|
|:官方名按位或,按位或是一种逐位比较两个二进制数的操作,只要两个二进制数中对应位有任意一位为1时,结果就为1,否则结果为0。
a = 10101111, b = 11011010,c = a | b
那么c就是11111111,也就是将 a 和 b 分别表示为二进制数后,逐位比较后得到的结果。
按位取反~
~:用于执行按位取反操作,0取反就是1,1取反就是0
a = 00111001, b = ~a
那么b就是11000110,就是a对应位是1,那么~操作就是取反变成0,同样的,a对应位是0,那么b对应位就是1。
按位异或^
^: 只有a,b两个二进制数对应位上的数不同时,结果才为1,相同时结果为0.
a = 00111001, b = 01010110, c = a ^ b
对比一下a和b每个位上的数,c为01101111。
<<向左移动n位
用法
a = 00111001,b = a << 2
a所有位置上的数左移两位,结果 b 的二进制值为 11100100
>>向右移动n位
用法
a = 00111001 ,b = a >> 2
a的所有位置上的数右移两位,结果b 的二进制值为 00001110