求C++更高效的位操作方式

_IDK 2016-04-22 05:12:48
尝试着做点东西,想法是在位上进行分析,这种过程得重复很多很多很多次,比如说1G的文件。学的C++,想如果有更高效的位的想法可以提高很大一部分的效率。
大概就是 对文件按位读取、按位分析、以类似指针的方式操作位

还有一些比较“诡异”(不知道怎么形容)的就是可能需要对类似
00001111 | 10100101

0000 | 11111010 | 0101
甚至
00 | 001 | 1111 | 01 | 001 | 01(夸大了一下,表示下意思)
进行操作
所以,我觉得需要点更高效的东西

或者仍然是传统的读取方式,但是在操作上进行一定的优化,提供一点思想
...全文
251 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级能量泡泡 2017-03-09
  • 打赏
  • 举报
回复
用多个结构体的字段数组组成union,然后在不同层次上使用位运算,用起来会方便点。但速度么,未必有什么快,可能还慢。
_IDK 2017-03-07
  • 打赏
  • 举报
回复
坑挖了这么久了。。。嗯其实也没想着能有解决方法,毕竟只是自己一时兴起的设想
lm_whales 2016-04-25
  • 打赏
  • 举报
回复
可以用硬件单独处理这种事情 目前有很多硬件可编程器件, 因为是并行处理,所以速度跟软件处理完全不是一个数量级的 要快很多
lm_whales 2016-04-25
  • 打赏
  • 举报
回复
C,C++只能用自身的位运算运算符(以及位段数据结构),对位进行处理 另外汇编级别 处理器有一些更好用的,处理位运算的指令可用 C,C++很难使用他们 也许最好的方式是嵌入 这些汇编指令
Enter空格 2016-04-23
  • 打赏
  • 举报
回复
不明白你的需求是什么,字面能理解的就是要处理速度块。 但实际上你这种按位读取的想法,只是单纯的可以节省空间的操作,速度上是会严重拖累CPU的。 CPU最大效能是根据位数决定的,CPU一次基本指令能运算32位或64位的数据,你却单纯的强制让他提取几位的数据。 这样速度会块? 好比有一百块砖,一个人的正常负荷可以一次搬4块砖,这样25次搬完,你强制让他一次搬一块或半块,这样效率高? 位信息读取的作用在于,一次读取足够多的字节后,如果知道需要的信息在这些字节的第几位,那么就可以直接按位访问, 而不是像你说的那样,按位读取。 但现在一般来讲,这是没意义的,大内存时代,不至于把信息压缩到位级。
_IDK 2016-04-23
  • 打赏
  • 举报
回复
引用 3 楼 Enter空格的回复:
不明白你的需求是什么,字面能理解的就是要处理速度块。 但实际上你这种按位读取的想法,只是单纯的可以节省空间的操作,速度上是会严重拖累CPU的。 CPU最大效能是根据位数决定的,CPU一次基本指令能运算32位或64位的数据,你却单纯的强制让他提取几位的数据。 这样速度会块? 好比有一百块砖,一个人的正常负荷可以一次搬4块砖,这样25次搬完,你强制让他一次搬一块或半块,这样效率高? 位信息读取的作用在于,一次读取足够多的字节后,如果知道需要的信息在这些字节的第几位,那么就可以直接按位访问, 而不是像你说的那样,按位读取。 但现在一般来讲,这是没意义的,大内存时代,不至于把信息压缩到位级。
还有我看了,硬件上限制,我只能在软件上对这种优化了,首先是对齐,然后用位结构体分开,然后。。
_IDK 2016-04-23
  • 打赏
  • 举报
回复
引用 4 楼 tm1mc2的回复:
C语言里有的。叫做“字段结构”,又叫“位段”。 C++要跟C语言兼容,所以估计也有。 它可以把一个字,即2字节,16位,分作几段来用。每段可以作为一个单独变量。 例如: struct a { unsigned b:5; unsigned c:6; unsigned d:1; unsigned e:4; }f; 这就定义了1个字段结构变量f和4个unsigned字段变量:f.b、f.c、f.d、f.e。他们的位数各为:5,6,1,4 一个字段变量可以超过一个字。但必须是整数个字。IBM PC机上的字段变量只能是无符号整数,不支持其他类型,连int都不行。 字段变量没有地址,没有指针。
这个我有知道,有想过
_IDK 2016-04-23
  • 打赏
  • 举报
回复
引用 3 楼 Enter空格的回复:
不明白你的需求是什么,字面能理解的就是要处理速度块。 但实际上你这种按位读取的想法,只是单纯的可以节省空间的操作,速度上是会严重拖累CPU的。 CPU最大效能是根据位数决定的,CPU一次基本指令能运算32位或64位的数据,你却单纯的强制让他提取几位的数据。 这样速度会块? 好比有一百块砖,一个人的正常负荷可以一次搬4块砖,这样25次搬完,你强制让他一次搬一块或半块,这样效率高? 位信息读取的作用在于,一次读取足够多的字节后,如果知道需要的信息在这些字节的第几位,那么就可以直接按位访问, 而不是像你说的那样,按位读取。 但现在一般来讲,这是没意义的,大内存时代,不至于把信息压缩到位级。
但是现在的情况我需要对位进行分析,对字节分析是通常的做法效率高,但是我想试着位分析效果可能更好,但是效率成了问题
赵4老师 2016-04-23
  • 打赏
  • 举报
回复
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快 写类似。
赵4老师 2016-04-23
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
tm1mc2 2016-04-23
  • 打赏
  • 举报
回复
参考资料:http://baike.baidu.com/view/2797777.htm
tm1mc2 2016-04-23
  • 打赏
  • 举报
回复
C语言里有的。叫做“字段结构”,又叫“位段”。 C++要跟C语言兼容,所以估计也有。 它可以把一个字,即2字节,16位,分作几段来用。每段可以作为一个单独变量。 例如: struct a { unsigned b:5; unsigned c:6; unsigned d:1; unsigned e:4; }f; 这就定义了1个字段结构变量f和4个unsigned字段变量:f.b、f.c、f.d、f.e。他们的位数各为:5,6,1,4 一个字段变量可以超过一个字。但必须是整数个字。IBM PC机上的字段变量只能是无符号整数,不支持其他类型,连int都不行。 字段变量没有地址,没有指针。
_IDK 2016-04-22
  • 打赏
  • 举报
回复
引用 1 楼 ID870177103的回复:
没办法,最小单位就是byte,你只能通过强制对齐牺牲空间来获得效率
那或许根据不同的情况选择合适的方式吧,如果空间不允许,或者需要限制,那也只能这样慢一点了
ID870177103 2016-04-22
  • 打赏
  • 举报
回复
没办法,最小单位就是byte,你只能通过强制对齐牺牲空间来获得效率
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针的指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧