bitset关于二进制运算
来源:互联网 发布:淘宝查询信誉网站 编辑:程序博客网 时间:2024/04/30 04:46
一、写在最前面
对于学习作业的记录,思考良多,还是不要面面俱到比较好。此后的博客都会只截取某一些部分进行个人思路的解说和注释,以便于重点突出。
二、关于bitset背景
建立一个表示32*5位的二进制数的5个int的集合,做到对各个位的检测、并且完成普通的二进制数能够完成的运算。
三、代码部分
1、对某一位的操作
这个函数是对整个数进行检测和取反操作的基础。原理在于对1进行移位,到对应位置时,运用二进制操作把对应的一位的数值取出,或者进行置1/置0操作。
以下是检测pos位是否为1的操作。这个函数可以被调用于所有对位操作的判断。
bool bitset::test(int pos) const{ if(pos>max_length-1) return false; int count=1; if(a[pos/32] & (count<<(pos%32))) return true; return false;}
以下就是对位进行值的改变。
获取掩码,还有进行的各种操作,都要熟悉。
void bitset::set(int pos){ if(pos>max_length-1) return; int arr=pos/32; int bit=pos%32; int count=1; a[arr]|=count<<bit;}void bitset::reset(int pos){ if(pos>max_length-1) return; int arr=pos/32; int bit=pos%32; int count=1; a[arr]&=~(count<<bit);}
对1进行pos的位移,之前的思考是直接用2的幂来和原数进行操作。但是没有考虑到整数类型的溢出问题,可能会造成原来的int数与一个负数操作,结果就不可预估了。
有了这些对位的基本操作,其他的对某一位进行操作的函数都可以通过调用他们简单的实现了。
2、左移/右移操作
其他的操作的话,每一个int对应另一个bitset进行操作就可以,不再赘述。
左移右移的操作,其实困难就在于每个int的最高位要接收上一个int的最低位,而不是简单的做位移操作。对于这个,我的办法是用一个临时数组存储最低位的数值,在每个int做位移操作之后,再修改每一个int的最高位。
bitset& bitset::operator >>= (int pos){ for(int i=0;i<pos;i++){ int k=0; int temp[N-1]={0};//临时数组存每个int最低位是0/1 for(k=0;k<N-1;k++){ if(test(32*(k+1))){//判断最低位是0还是1 temp[k]=1; continue; } temp[k]=0; } for(k=0;k<N;k++){//所有int右移 a[k]>>=1; } for(k=0;k<N-1;k++){//把上个int最低位填到下个int最高位 if(temp[k]==0){ reset(32*(k+1)-1); } else set(32*(k+1)-1)); } } return *this;}
左移和右移的思想是完全相同的,以上是右移操作。左移就是把右边int的最高位最后填到左边int的最低位。
四、总结
对bitset这个类做记录,主要是自己对二进制的操作非常不熟悉。特别是对某一位的操作,以及左移右移的问题。面对这个由许多int拼接起来的二进制数,更加容易一脸蒙蔽。
首先,对于每一个位的操作,一是在于找准哪一位,二是在于如何得到掩码并进行操作,这些在网上都有资料,也很容易想清楚。
其次,左移右移的问题确实比较麻烦,同样要注意找准位的问题。还有对于基本的一位一位移动的思想,还是只是对最高最低位进行操作比较划算。
最后记录一下题目中的输出函数。其中思想就可以用于对整个二进制数进行遍历,可以对二进制数进行输出或者统计工作。
friend std::ostream& operator << (std::ostream& os, const bitset& s) { for (int i = N-1; i >= 0; i--) { for (int j = 31; j >= 0; j--) { if (s.a[i] & (1 << j)) os << 1; else os << 0; } } return os; }
- bitset关于二进制运算
- Bitset (二进制转化)
- 二进制的使用<bitset>
- 关于bitset
- 关于二进制和位运算(小结)
- 【C++】 [转] 二进制操作 bitset
- Bitset(十进制转二进制)
- C++bitset二进制有序集
- 通过bitset输出二进制数
- 二进制运算
- 二进制运算
- 二进制运算
- 二进制运算
- 二进制运算
- 二进制运算
- 二进制运算
- 二进制运算
- Java Bitset和位运算
- 再论C语言中的指针和数组
- Centos安装Django并创建项目
- 【数学】一个奇技淫巧:如果用一枚硬币生成任意概率——比如1/π?
- # Android文件存储和数据库基本知识
- 博客笔记图片
- bitset关于二进制运算
- 最长上升子序列的变化
- JS原生轮播图代码
- 雅可比矩阵 和 海森矩阵
- 一步一步搞清排序之选择排序(JAVA)
- Vulkan编程指南翻译 第七章 图形管线 第4节 创建简单的图形管线(下)
- RQNOJ:PID3 / Jam的计数法
- C实现Unix时间戳和本地时间转化
- Java遍历List四种方法的效率对比