几个常用的位操作

简介:

下面的结论都是基于用补码表示负数的计算机平台
 1 void  main(unsigned  int  x)
 2 {     
 3     //判断无符号整数x是否是2的幂 
 4     if(x&(x-1))//若一个数是2的幂,则除最高位为1外,其余位均为0(二进制表示,下同)
 5         printf("False\n");
 6     else
 7         printf("True\n");
 8                      
 9     //判断一个无符号整数是否为2^n-1的形式(原理同上) 
10     if(x&(x+1))//若为2^n-1,则低位全为1 
11         printf("False\n");
12     else
13         printf("True\n"); 
14         
15     //整数能被最大的2的幂(?)整除 : 析出最右侧为1的位
16     //e.g.: 100->4
17     printf("%d\n",x&(-x));//将其余位置0 
18     
19     //析出最右侧为0的位(原理同上) 
20     //e.g.:111b->1000b, 10->1
21     printf("%d\n",~x&(x+1));//将该位置1,其余位置0
22     
23     //识别后缀0的掩码(将右侧连续的0位置1,其余各位置0)
24     //e.g.:1100b->0011b
25     printf("%d\n"~x&(x-1));  //或 
26     printf("%d\n"~(x|-x));   //或 
27     printf("%d\n", (x&-x)-1);
28     
29     //识别最右侧的1未和后缀0的掩码(将最右侧的1位保留,并将其后面所有的0位置1) 
30     //e.g.:1100b->0111b
31     printf("%d\n", x^(x-1)); 
32     
33     //向右传播最右侧的1位 
34     //e.g.:1100b->1111b
35     printf("%d\n", x|(x-1));
36     
37     //将最右侧连续的1位置0
38     //e.g.:10110b->10000
39     printf("%d\n", ((x|(x-1))+1)&x);     
40}


计算x中有多少个为1的位:
 1 int  Count1( int  x)
 2 {
 3    int n = 0;
 4    while(x)
 5    {
 6            n++;
 7            x&=x-1;
 8    }

 9    return n;
10}


获取下一个具有同样数量的1位的更大的数;应用:在用位串表示集合的子集时 
1 unsigned snoob(unsigned x)
2 {
3    unsigned smallest, ripple, ones;//e.g.: x=XXX0 1111 0000
4    smallest = x & -x;              //        0000 0001 0000
5    ripple = x + smallest;          //        XXX1 0000 0000
6    ones = x ^ ripple;              //        0001 1111 0000
7    ones = (ones >> 2/ smallest;  //        0000 0000 0111
8    return ripple | ones;           //        XXX1 0000 0111
9}


本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2007/04/24/725127.html ,如需转载请自行联系原作者
相关文章
|
移动开发 算法 JavaScript
平滑切换——PPT动画的全新玩法(原理篇)/04/O365智能系列(一)
平滑切换——PPT动画的全新玩法(原理篇)/04/O365智能系列(一)
3646 1
平滑切换——PPT动画的全新玩法(原理篇)/04/O365智能系列(一)
|
Java Unix Linux
什么是阻塞IO和非阻塞IO
什么是阻塞IO和非阻塞IO
577 3
陌陌自动发布动态脚本,批量群发私信打招呼插件,附近人动态自动点赞工具
这是一款针对陌陌平台开发的自动化营销工具源码,适用于保健品、洗浴按摩等项目的推广。通过模拟点击、点赞、私信等功能
|
自然语言处理 API 数据可视化
阿里云升级Premier级别WhatsApp官方商业解决方案提供商,赋能全球企业高效连接30+亿用户
国内有哪些 WhatsApp Business API 官方服务商?阿里云是 Meta 认证的 Premier 级 BSP,为中国企业提供合规、智能的 WhatsApp 接入服务。
375 0
|
传感器 缓存 芯片
IMU调试方案
本文是关于IMU(惯性测量单元)QMI8658C型号的调试方案,包括I2C和SPI通信协议的详细介绍、接线方法、工作原理以及优缺点分析,并提供了相关的数据手册和开发资源链接。
410 4
IMU调试方案
|
存储 机器学习/深度学习 安全
云计算与网络安全的融合之路:策略、挑战与未来展望
【5月更文挑战第13天】 随着数字化转型的不断深入,云计算已成为企业及个人存储和处理数据的首选平台。然而,云服务的广泛使用也引入了新的安全风险和挑战,尤其是在数据保护、隐私和合规性方面。本文探讨了云计算环境下网络安全的现状,分析了当前面临的主要安全威胁,并提出了相应的防护措施。同时,文中还讨论了如何通过采用创新的安全技术和策略来加强云计算的安全性,以及在不断变化的网络威胁环境中保持弹性的必要性。最后,文章对未来云计算和网络安全的发展趋势进行了展望,指出了实现更安全云计算环境的潜在途径。
|
Ubuntu Shell Linux
Ubantu终端常用命令、快捷键和基本操作(系统性学习day2)
Ubantu终端常用命令、快捷键和基本操作(系统性学习day2)
|
机器学习/深度学习 传感器 编解码
Hy-Tracker来啦 | 带有YOLO的跟踪算法家族再添新成员,尺度变化和遮挡都不是问题!
Hy-Tracker来啦 | 带有YOLO的跟踪算法家族再添新成员,尺度变化和遮挡都不是问题!
556 1
|
Linux
Linux命令之dmesg
Linux命令之dmesg
822 4