表达式:(n&(n-1))==0——n是否是一个2幂次方的数

一、分析一下

(n&(n-1))==0——n是否是一个2幂次方的数?

1、找规律

0:0000

1:0001

2:0010

3:0011

4:0100

5:0101

6:0110

7:0111

8:1000

......

我可以发现1&0等于0;2&1等于0;4&3等于0;8&7等于0。

1、2、4、8都是2幂次方的数。

二、实战场景

1、判断当前编译环境指针的大小是否正确。

我们知道指针的大小肯定为一个2幂次方的数。

const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8;
assert((align & (align-1)) == 0); 

2、求一个数的二进制表示中1的个数

while (n >0 )
 {
      count ++;
      n &= (n-1);
}
时间: 2024-12-03 21:31:12

表达式:(n&(n-1))==0——n是否是一个2幂次方的数的相关文章

java-JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个)

问题描述 JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个) 用 0到9 生成 十位数的所有排列组合,数字0不能在第一个,这个生成的十位数, 不能有重复的数字. 解决方案 public static void main(String[] args) { String str[] = { "0", "1", "2", "3", "4", "5", "6"

application-android 关于Application中使用System.exit(0)退出应用的一个问题。

问题描述 android 关于Application中使用System.exit(0)退出应用的一个问题. 求解,关于android Application中使用System.exit(0)退出应用导致启动Activiry时闪退的一个问题: 在一个项目中看到在Application中使用System.exit(0)来实现应用的完全退出,因此自己也照着做了,但项目中应用的退出并没有让Activiry走完它的生命周期,所以我用了以下的方法: public class App extends Appl

mysql安装-mysql 5.6 安装后每天0点都会跳出一个提示框,如何关闭?

问题描述 mysql 5.6 安装后每天0点都会跳出一个提示框,如何关闭? 如题 解决方案 如果你是Windows7或者以上,点开始菜单,在搜索里面输入计划任务.在计划任务里面查找LibraryMySQLInstaller或者taskeng,看看与MYSQL相关的,禁用掉应该就可以了. 解决方案二: Unable to connect to remote host.这个提示应该是服务器连接不上引起的 解决方案三: 对应server访问有问题

vb6.0-VB6.0系统中打印一个平行四边形,用button1_click两个循环实现,请问怎么做?

问题描述 VB6.0系统中打印一个平行四边形,用button1_click两个循环实现,请问怎么做? VB6.0系统中打印一个平行四边形,用button1_click两个循环实现,请问怎么做? 解决方案 for i = 1 to 5 print tab(i); for j = 1 to 5 pirnt "*"; next print "" next

百度地图api2 0-百度地图api2.0,创建了一个文本框,建了一个自动完成时间

问题描述 百度地图api2.0,创建了一个文本框,建了一个自动完成时间 ,在文本框中输入关键字,显示提示地点,但是无法显示我给文本框的初始值 解决方案 没关键的代码 没log 谁也不知道是啥问题 解决方案二: 查看一下SDK等,是否有对应的说明,估计调用方法有问题

ios-IOS 每0.2秒获得一个UIImage对象 怎么把这些对象转换为视频显示

问题描述 IOS 每0.2秒获得一个UIImage对象 怎么把这些对象转换为视频显示 这个数据是从摄像头过来的 uuimage都是不同的对象 怎么能把这些uiimage变成视频展示出来呢 如果不断地更新UIImageVIew的image的话 会内存不足导致程序闪退 解决方案 dispatch_sync(dispatch_get_main_queue(), ^{ CGSize imageSize = [UIScreen mainScreen].bounds.size; UIGraphicsBegi

c程序问题 函数调用-冒泡排序c程序,vc6.0编译提示有一个错误一个警告,但不知为什么错,也不知怎么改

问题描述 冒泡排序c程序,vc6.0编译提示有一个错误一个警告,但不知为什么错,也不知怎么改 程序如下: #include #define TRUE 1 #define FALSE 0 void main() { int i; int a[10]; printf("please input 10 numbers:n"); for(i=0;i { scanf("%d",a[i]); } bubble(a[10],10); for(i=0;i printf("

http 1 0 404-Internet 网站报告:找不到需要的内容(HTTP/1.0 404)打开一个文件链接

问题描述 Internet 网站报告:找不到需要的内容(HTTP/1.0 404)打开一个文件链接 开始的时候报404错误,后来自动恢复了,我想知道原因: ie浏览器版本为ie7,ie8 ,ie8兼容, Word 版本为07 或者10 都测试过,却无法复现! 个人猜测是Word版本和ie浏览器版本冲突,可是却不能复现了,反复一下子就好了. 客户还存在这种问题,求答案,该如何解释!

InstallShield2010如何把.net 4.0环境打包成一个EXE文件进行选择安装?

问题描述 各位大侠我用InstallShield2010打包的.net4.0环境都是预安装,我想把.net4.0环境打包成一个EXE文件进行安装,不带文件夹的那种?求大侠们教我! 解决方案 解决方案二:使用InstallShieldPackageForTheWeb可以方便地将安装程序打包成单一exe的形式.解决方案三:好的我试试看看!解决方案四:你把.netframework4.0打到包,然后在输出的时候,输出为一个一个压缩可执行文件就可以.注意.netframework4.0需要选择32位和6