出自开源库klib(一个c语言的标准库)中。github地址。

一. 函数解释

  • 对于32位的机器的二进制数字进行向上的四舍五入

  • 例如 7(111)->8(1000), 12(1100)->(10000)

#include <stdio.h>
#include <stdint.h>
#ifndef kroundup32
#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
#endifint main(int argc, char const *argv[])
{int x=7; kroundup32(a);printf("%d\n",x); // 显示8(1000)return 0;
}

二. 解释说明

1. 举例 00000000000000000101001011011011

2. 步骤1 --x

数字减一,避免进一步的四舍五入。例如 100不向1000进行四舍五入的进位,10000不向100000进行四舍五入的进位。

3. 步骤2 通过右移和"|"运算, 分别把一"补"入到每一个位置,直到每一个位置都是"1"为止

1. 右移1位 -> 保障前2个位置都变成1
00000000000000000101001011011010
|0000000000000000010100101101100
---------------------------------
00000000000000000111001011011010

2. 因为为上一次的"|"运算,使得前2位都是"1"所以这次右移2位 -> 保障前4个位置都变成1
00000000000000000111001011011010
|000000000000000001110010110110
---------------------------------
00000000000000000111111011111111

3. 同上 因为为上一次的"|"运算,使得前4位都是"1"所以这次右移4位 -> 保障前8个位置都变成1
00000000000000000111111011111111
|0000000000000000011111101111
---------------------------------
00000000000000000111111111111111
4. 同上 因为为上一次的"|"运算,使得前8位都是"1"右移8位 -> 保障前16个位置都变成1
00000000000000000111111111111111
|000000000000000001111111
---------------------------------
00000000000000000111111111111111
5.  同上 因为为上一次的"|"运算,使得前16位都是"1" 右移16位 -> 保障前32个位置都变成1
00000000000000000111111111111111
|0000000000000000
---------------------------------
00000000000000000111111111111111

4. 步骤3 ++x

以为上一步中将这个数字的所有为止都变成了1,所以"+1"后就完成了进位的工作

klib库下的kroundup32(二进制的四舍五入)算法相关推荐

  1. 「bitset」库下的便捷二进制转换

    基本含义 int n;// 将要转换为二进制的数 string temp;// 承载二进制数据的字符串 bitset<8> bit;// 将要转换的数据给bit赋值,数字n将会被自动转换为 ...

  2. 社区生态 | openEuler、龙蜥Anolis、统信UOS三大主流操作系统下编译GreatSQL二进制包

    为了更好地支持更多操作系统及相关生态,GreatSQL社区决定发布openEuler.龙蜥Anolis.统信UOS三个操作系统下的GreatSQL二进制包.相应的二进制包可以访问gitee.com上的 ...

  3. hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

    自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题.又又又遇到了新的问题(GP ...

  4. mysql5.7 mysql库下面的user表没有password字段无法修改密码

    如题所述,mysql5.7  mysql库下面的user表没有password字段无法修改密码, 5.7版本已经不再使用password来作为密码的字段了  而改成了authentication_st ...

  5. 【爬虫剑谱】三卷4章 拾遗篇-关于lxml库下etree模块中Xpath表达式的使用小结

    关于lxml库下etree模块中Xpath表达式在实战后的快速上手小结 一.Xpath表达式 1. 将 etree 对象实例化的两种方法 (1)etree.parse() 转本地HTML文档 (2)e ...

  6. STM32F103VE基于标准库下DHT11数据串口打印输出

    STM32F103VE基于标准库下DHT11数据串口打印输出

  7. mysql 获取一个库下的所有表名

    http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html 官网上的第一个例子: mysql> SELECT table_nam ...

  8. 清空MySQL单库下所有表数据 || 删除MySQL单库下所有表

    一.清空MySQL单库下所有表数据 -- 清空MySQL单库下所有表数据 SELECT CONCAT('truncate table ',TABLE_NAME,';') AS PLEASE_EXEC_ ...

  9. Altium Designer操作——创建元器件——同一SchLib库下创建多个器件模型

    Altium Designer操作--创建元器件--同一SchLib库下创建多个器件模型 Altium Designer的使用者,无论是老手还是新手,基本都离不开自己动手画元器件的原理图以及PCB封装 ...

最新文章

  1. 第28讲 | 弄懂数字货币交易平台(二)
  2. 机器学习中为啥要有验证集?只要训练集和测试集不就可以了吗?
  3. 工作总结13:vue官网封装组件
  4. jeecms附件标签用法
  5. 投稿过程要不要考虑预印本?——medRxiv那些事
  6. 2001~2020大数据行业怎么样?面临哪些挑战?解决了什么问题?
  7. 汇编语言mul指令_跟着开源软件学汇编语言:计算器
  8. 【iOS开发必备指南合集二】申请IDP/真机调试/GameCenter 指南/OpenFeint指南
  9. top命令详解(转载)
  10. mac 生成公私钥key
  11. HTML5页面增强元素
  12. jquery fadein css同时用,Fadein,fadeout事件一起使用jquery
  13. Web用户控件开发--分页控件
  14. 清华镜像源地址(国内下载python包必备地址)
  15. SpringCloud(13)之微服务的现状和未来
  16. python中x%y是什么意思_python是什么
  17. 批量创建对象的四种模式
  18. 测试点击屏幕次数的软件_测试大佬分享:WEB和APP测试小结
  19. Zabbix icmp pinger processes more than 75% busy
  20. 重庆大学计算机学院刘然,重庆大学考研研究生导师简介-刘然

热门文章

  1. python多线程爬虫实例-Python3多线程爬虫实例讲解代码
  2. Opengl-实例化(不知道为啥叫实例化,感觉应该叫一次批量渲染)
  3. LeetCode Count and Say
  4. Spark- 使用第三方依赖解析IP地址
  5. Laravel 任务调度(Console)
  6. tensorflow 对csv数据进行批量获取
  7. 为什么写博客?如何在博客中更好的分享?
  8. 【Java面试题】13 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?...
  9. docker命令行解析以及如何向服务器端发送请求(docker源码学习一)
  10. iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象...