博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言之位运算
阅读量:6803 次
发布时间:2019-06-26

本文共 1114 字,大约阅读时间需要 3 分钟。

1.今天看到两个不错的位运算,一个是判断一个整数是否是2的n次幂,另一个是将一个非2的n次幂整数,经转变得到大于该数的2的n次幂整数。

2.判断一个整数是否是2的n次幂.

static inline intis_pow_of_2(uint32_t x) {    return !(x & (x-1));}

  该方法利用了若一个数x为2的n次幂(n >= 0)则一定有 x & (x - 1) = 0.

3.将一个非2的n次幂整数,经转变得到大于该数的2的n次幂整数。

static inline uint32_tnext_pow_of_2(uint32_t x) {    if ( is_pow_of_2(x) )        return x;    x |= x>>1;    x |= x>>2;    x |= x>>4;    x |= x>>8;    x |= x>>16;    return x+1;}

若一个unint32_t类型的整数x,且x非2的n次幂(n >= 0),则经过:

  x |= x>>1; x |= x>>2; x |= x>>4; x |= x>>8; x |= x>>16;

运算后便可得到 y = 2^m - 1,其中y + 1为最小的大于x的且是2的m次幂的整数.

例如: x = 3, 经过上边的运算后,便可得到 y = 2 ^ 2 - 1 = 3, y + 1 = 4;

    x = 9, 经过上边的运算后,便可得到 y = 2 ^ 4 - 1 = 15, y + 1 = 16;

这样遍得到最小的大于9且是2的n次幂的整数。

 

-------------------------------------------------------------------------------------------

补充1 判断某个数的第n位是否被设置为1

template 
bool GetBitFlag(const T &val, int32_t idx){ int nbytes = idx / 8; int nbit = idx % 8; if(nbytes >= sizeof(T)) { return false; } const char *c = ((char *)&val) + nbytes; return (*c & (1 << nbit)) > 0;}

 

转载于:https://www.cnblogs.com/newbeeyu/p/5937262.html

你可能感兴趣的文章
AT&T开发出400 GbE试验的SDN控制器
查看>>
聊天机器人并不适合每一项业务和每个人
查看>>
拼写错误影响黑客盗窃数亿美元
查看>>
真正的持续集成:分布式代码仓库和依赖
查看>>
KDD论文解读 | 想要双11抢单快?靠这个技术提速9MS
查看>>
Asp.net与Flex交互测试记录
查看>>
两招抵御APT攻击
查看>>
教师节有“假期” 网络电话传递温情祝福
查看>>
中天携手协鑫集成共拓光伏市场
查看>>
云存储与视频监控协力合作 平安城市再提速
查看>>
Windows环境搭建Web自动化测试框架Watir
查看>>
再等两年 英特尔能否重回摩尔定律?
查看>>
智慧城市建设 这五个方面不可不考虑
查看>>
Qt之镜像旋转
查看>>
《Cinema 4D + After Effects动态图形设计案例解析》——第 1 章 动态图形设计概述 1.1 什么是动态图形...
查看>>
WordPress REST API 内容注入/权限提升漏洞
查看>>
深圳网站建设公司|网站文章不收录的四大决定性因素|卓炎科技
查看>>
《实施Cisco统一通信管理器(CIPT1)》一第2章 部署模型
查看>>
《SolidWorks 2013中文版完全自学手册》——2.4 尺寸标注
查看>>
《Adobe Photoshop CS4中文版经典教程》—第1课1.4节在Photoshop中还原操作
查看>>