注册 登录
编程论坛 C++教室

没事瞎想 :关于申请数组元素不固定的一个想法

wp231957 发布于 2013-12-18 10:35, 437 次点击
刚刚写了一段小程序   利用位运算来计算一个数字的二进制中包含的1的个数的

写完之后  突然想把这些1 都位于哪个位上  也返回给函数调用者

但是由于1的个数不固定  所以申请空间 不知道咋弄比较好

比如  (10)153=(2)10011001  返回1的个数是4 返回位置分别是  左1 左4 左5 左8
9 回复
#2
pangshch2013-12-18 10:43
C++在可变长数组方面好像很方便, string类好像也有这方面功能,就是每读到1就分配一个内存, 我不是很熟悉,错了可以指出来.
最直接最复杂的就是用链表了.
#3
rjsp2013-12-18 11:15
1的个数不固定
但1的最大个数是一定的
#4
wp2319572013-12-18 11:25
以下是引用rjsp在2013-12-18 11:15:33的发言:

1的个数不固定
但1的最大个数是一定的
恩,以dword类型为准  我的电脑应该是31个1

那设置60多个长度应该就够了
#5
rjsp2013-12-18 11:50
dword类型最多应该是32个1吧

我觉得你这个想法最大的问题是,从你的函数结果类型中取出结果,并不比直接从二进制数据中取出结果来得快。
也就是说,你换了一种二进制表示形式,但不如原始二进制表示形式来得高效。

想找1的位置,有汇编指令bsf,比如VC中对应的是_BitScanForward
#6
wp2319572013-12-18 13:31
code blocks  不支持内联汇编   无法测试了
#7
rjsp2013-12-18 14:12
Code::Blocks只是个IDE,而不是编译器。基本上所有的C/C++编译器都支持内嵌汇编
比如 VC 的 __asm xxxx。intel汇编格式
比如 GCC 的 __asm__( "xxxx" )。AT&T汇编格式

另外,这些常用的汇编指令在各个库中都扩展支持了,不需要内嵌汇编,比如gcc的 http://rchardx.
vc的在<intrin.h>中
#8
wp2319572013-12-18 14:20
看了一下   bsf bsr 系列指令 均只是扫描第一个1  扫到或扫不到  并不继续下一个1的扫描
#9
rjsp2013-12-18 14:33
找到后,将那个bit置0
a &= ~(1<<n)
或者
a ^= (1<<n)
#10
wp2319572013-12-18 14:55
终于弄出来了  代码写的太乱了  就不贴了  贴一下结果吧

程序代码:


 1的二进制里面有1个1  分别位于 D[0]

 2的二进制里面有1个1  分别位于 D[1]

 3的二进制里面有2个1  分别位于 D[0]  D[1]

 4的二进制里面有1个1  分别位于 D[2]

 5的二进制里面有2个1  分别位于 D[0]  D[2]

 6的二进制里面有2个1  分别位于 D[1]  D[2]

 7的二进制里面有3个1  分别位于 D[0]  D[1]  D[2]

 8的二进制里面有1个1  分别位于 D[3]

 9的二进制里面有2个1  分别位于 D[0]  D[3]
10的二进制里面有2个1  分别位于 D[1]  D[3]
11的二进制里面有3个1  分别位于 D[0]  D[1]  D[3]
12的二进制里面有2个1  分别位于 D[2]  D[3]
13的二进制里面有3个1  分别位于 D[0]  D[2]  D[3]
14的二进制里面有3个1  分别位于 D[1]  D[2]  D[3]
15的二进制里面有4个1  分别位于 D[0]  D[1]  D[2]  D[3]
16的二进制里面有1个1  分别位于 D[4]
17的二进制里面有2个1  分别位于 D[0]  D[4]
18的二进制里面有2个1  分别位于 D[1]  D[4]
19的二进制里面有3个1  分别位于 D[0]  D[1]  D[4]
20的二进制里面有2个1  分别位于 D[2]  D[4]
21的二进制里面有3个1  分别位于 D[0]  D[2]  D[4]
22的二进制里面有3个1  分别位于 D[1]  D[2]  D[4]
23的二进制里面有4个1  分别位于 D[0]  D[1]  D[2]  D[4]
24的二进制里面有2个1  分别位于 D[3]  D[4]
25的二进制里面有3个1  分别位于 D[0]  D[3]  D[4]
26的二进制里面有3个1  分别位于 D[1]  D[3]  D[4]
27的二进制里面有4个1  分别位于 D[0]  D[1]  D[3]  D[4]
28的二进制里面有3个1  分别位于 D[2]  D[3]  D[4]
29的二进制里面有4个1  分别位于 D[0]  D[2]  D[3]  D[4]
30的二进制里面有4个1  分别位于 D[1]  D[2]  D[3]  D[4]
31的二进制里面有5个1  分别位于 D[0]  D[1]  D[2]  D[3]  D[4]
32的二进制里面有1个1  分别位于 D[5]
33的二进制里面有2个1  分别位于 D[0]  D[5]
34的二进制里面有2个1  分别位于 D[1]  D[5]
35的二进制里面有3个1  分别位于 D[0]  D[1]  D[5]
36的二进制里面有2个1  分别位于 D[2]  D[5]
37的二进制里面有3个1  分别位于 D[0]  D[2]  D[5]
38的二进制里面有3个1  分别位于 D[1]  D[2]  D[5]
39的二进制里面有4个1  分别位于 D[0]  D[1]  D[2]  D[5]
40的二进制里面有2个1  分别位于 D[3]  D[5]
41的二进制里面有3个1  分别位于 D[0]  D[3]  D[5]
42的二进制里面有3个1  分别位于 D[1]  D[3]  D[5]
43的二进制里面有4个1  分别位于 D[0]  D[1]  D[3]  D[5]
44的二进制里面有3个1  分别位于 D[2]  D[3]  D[5]
45的二进制里面有4个1  分别位于 D[0]  D[2]  D[3]  D[5]
46的二进制里面有4个1  分别位于 D[1]  D[2]  D[3]  D[5]
47的二进制里面有5个1  分别位于 D[0]  D[1]  D[2]  D[3]  D[5]
48的二进制里面有2个1  分别位于 D[4]  D[5]
49的二进制里面有3个1  分别位于 D[0]  D[4]  D[5]
1