想直接看十进制转二进制的同学可以跳转:

目录

p.用移位运算符转十进制为二进制

子集是一个数学概念:如果集合A任意一个元素都是集合B的元素,那么集合A称为集合B子集

--百度百科

现在给你一个数组,按任意顺序输出这个数组的子集(空集也算哟~)。

遇见这中题目最容易想的就是DFS:

1、从0开始设置数组的长度;

2、将数组长度固定,传入DFS函数,循环递归得出子集。

一般的写法很麻烦,小编今天整些花活,用移位运算符来写

关于移位运算符的详细介绍,我在这里就不多赘述了,大家在CSDN上一查便知。

众所周知:移位运算符只针对二进制数,例如:

3 的二进制数是 011 ,将它右移移位,即 3 >> 1; 得到 001 等于1,所以

3 >> 1 = 1; 

p.用移位运算符转十进制为二进制

对于一个数组,根据这个数组的元素是否在当前子集的状态,我们可以定义为:

如果这个元素在子集当中,就这个元素的状态为1,否则为0,即对应于所有的子集,都有一个与数组长度相等的二进制串:如下表所示(图片来源于leetcode官方题解)

请大家仔细观察,假设数组为{1,2,3},长度为3,从0遍历到3,得到的数的二进制串为:

000

001

010

100

101

110

111

在长度上,这组二进制串的个数刚好等于长度为3的数组的子集个数,在元素内容上,按照上面所述的方法:每一个二进制串表示的数字都是原数组的子集,并且没有重复,例如:

110 表示数组{1,2},是原数组的子集;100表示数组{1},也是原数组的子集。由此看来:

这题的思路就非常简单了:

假设数组长度为n,for从0遍历到n, 再对应的求出每一个二进制串所表示的数字即可。

问题来了,我们得到的是0~n的整数,怎么获取对应的二进制串呢?或者说,怎么获取对应的二进制串所表达的信息--数字串呢?

移位运算符可以做到!

假设现在得到的数字是:3,    让 1 & 3,  结果等于1

再将 3 右移移位,得到1, 重复上面的操作,1 & 1, 得到 1

在将1 右移一位, 得到0, 1 & 0, 得到 0 ,

组合上面红色的数字,得到 011 ,恰好是 3 的二进制串。

总结规律:假设我们知道二进制串的长度k,和这个二进制串所表示的整数s,我们用while循环n次,保存每次得到的数字后将s右移一位,倒序即可得到这个整数所表示的二进制串。

上代码:

//子集
vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>>ans;int n = nums.size();for (int i = 0; i < pow(2,n); i++){vector<int>ret;int flag = n - 1;int k = i;while (flag >= 0){if (1 & k){ret.push_back(nums[flag]);}flag--;k = k >> 1;}ans.push_back(ret);}return ans;
}int main()
{vector<int>nums;for (int i = 0; i < 3; i++){int a = 0;cin >> a;nums.push_back(a);}vector<vector<int>>ans = subsets(nums);for (int i = 0; i < ans.size(); i++){for (int j = 0; j < ans[i].size(); j++){cout << ans[i][j] << " ";}cout << endl;}return 0;
}

希望和诸君共勉!

移位运算符解子集问题--用移位运算符转十进制为二进制相关推荐

  1. Java移位运算符详解实例——左移位运算符、带符号的右移位运算符

    移位运算符也针对二进制的"位",它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>). 1.左移运算符 ...

  2. mysql所支持的比较运算符_mysql比较运算符有哪些?Mysql比较运算符详解

    比较运算符可用于比较数字和字符串.今天发一篇Mysql比较运算符详解,希望对初学者有所帮助,虽然现在流行NoSQL,但是MYSQL还是很有用的,数字作为浮点值进行比较,字符串以不区为例进行比较,=运算 ...

  3. 展开运算符解构赋值_解构式展开式搜索栏

    展开运算符解构赋值 View demo 查看演示Download Source 下载源 Maybe you have noticed the little adjustments that we di ...

  4. 多段实例代码详解7大类Python运算符,建议收藏!

    导读:本文主要介绍Python运算符.举个简单的例子:4+5=9,其中,4和5被称为操作数,+称为运算符.Python语言支持以下类型的运算符:算术运算符.比较(关系)运算符.赋值运算符.逻辑运算符. ...

  5. 【详解】位运算符:位逻辑运算符,位移运算符(<<左移,>>右移)

    位运算符包括位逻辑运算符.位移运算符.最近做算法的时候经常用到,现在来总结下. 重点掌握的是 左移 << ,右移 >> . 1.位逻辑运算符 那么位逻辑运算符怎么计算的呢?先看 ...

  6. 增量C语言,详解C++中的增量运算符++和减量运算符--的用法

    前缀增量和减量运算符:++ 和 -- 语法 ++ unary-expression –– unary-expression 备注 前缀递增运算符 (++) 向其操作数添加 1:此递增值是表达式的结果. ...

  7. python ** 运算符_Python从入门到放弃运算符(2)

    摘要:上一篇Python从入门到放弃-运算符(1),讲了Python的运算符中的算术运算符.赋值运算符.比较(关系)运算符,这篇继续讲Python的运算符. 逻辑运算符 逻辑运算符是对真和假两种布尔值 ...

  8. swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...

    swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...

  9. c语言 正号运算符 作用,C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,...

    1级(左结合) () 圆括号:[]下标运算符:->指向结构体成员运算符:. 结构体成员运算符. 2级(右结合) !逻辑非运算符:~按位取反运算符:++前缀增量运算符:--前缀减量运算符:+正号运 ...

最新文章

  1. C++中vector的使用
  2. 我的Android进阶之旅------gt;Android APP终极瘦身指南
  3. 代码坏味道 - 耦合
  4. SAP上线前数据重置方式总结
  5. 使用 gitlab 进行代码管理
  6. 20应用统计考研复试要点(part9)--应用多元分析
  7. java面向对象小程序_java运用面向对象的思想实现计算器的小程序
  8. html语言对齐是什么意思,html – 对齐RTL语言的元素
  9. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
  10. 三大数据库数据库端口号及连接jdbc驱动下载
  11. VC++实现混合静态分裂视窗的方法
  12. 火狐html5播放器,可能用户已经发现你在火狐内建HTML5音视频播放器
  13. ASP编程实现各家快递公司订单状态查询
  14. 小团队如何提高工作效率
  15. 【ipone开发学习】-2、利用现有资源第二步 硬盘安装Snow LeopardXcode
  16. 爬取微信公众号cookie获取与token获取
  17. 爆肝1万字《c++入门综合》
  18. TWebLive基于TRTC和IM实现web群直播
  19. java adobe pdf转word_ADOBE READER把PDF转换成WORD教程
  20. 海洋环境保护具体内容

热门文章

  1. google云端硬盘colab
  2. 为什么一定要亲身经历了之后才能明白?
  3. c语言中mikado_蜜蜂如何使用mikado方法
  4. Python 保留两位小数几种方法
  5. 一位选择困难症及其强迫症患者使用喜马拉雅FM的Flash point!
  6. 【网络知识】mac组播地址和单播地址
  7. Android手机应用接口大全
  8. 【解决scikit_learn.libs/libgomp-d22c30c5.so.1.0.0:cannot allocate memory in static TLS block问题】
  9. 青龙脚本(顺丰速运,附脚本)
  10. Overriding和Overloaded的区别