C/C bit 位操作
一些有关C++语言中的bit操作
1) 函数实现交换两个int型变量的值,要求不定义任何中间变量。
C / C++ 版:
void Swap(int *a, int *b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}
C++ 版:
void Swap(int &a, int &b)
{
a^=b;
b^=a;
a^=b;
}
分析一下:
(a ^ b = s) (b ^ s = a)
0 ^ 1 = 1 1 ^ 1 = 0
1 ^ 0 = 1 0 ^ 1 = 1
1 ^ 1 = 0 1 ^ 0 = 1
0 ^ 0 = 0 0 ^ 0 = 0
归结一下:1. 两个数相异或,相同的位清0,不同的位置1。 (所以才有了 XOR eax, eax ;eax清零)
2. s = (a ^ b); (b ^ s) == a ? Yes. 异或加密解密的基础.
2) 摘自《高效程序的奥秘》一书。英文书名<Hacker’s Delight>,译为《黑客的窃喜》
获得后缀0bit的个数。(从低位开始的连续的0bit,间接地求最低位的1bit的位置)
int ntz(unsigned x) { // Number of trailing zeros.
int n;
if (x == 0) return(32);
n = 1;
if ((x & 0x0000FFFF) == 0) {n = n +16; x = x >>16;}
if ((x & 0x000000FF) == 0) {n = n + 8; x = x >> 8;}
if ((x & 0x0000000F) == 0) {n = n + 4; x = x >> 4;}
if ((x & 0x00000003) == 0) {n = n + 2; x = x >> 2;}
return n - (x & 1);
}
3) 除了最低位的bit1,其余位全清0. <Hacker’s Delight>一书。
n = n & (-n) < - - - - > n = n & (~n + 1)
分析一下:
假设n(2) = X…X10…0。其中每个X代表bit值并不都是相同,0的个数≥0,¯X表示该位取反。
X & ¯X = 0, 1 & 0 = 0
则~n(2) = ¯X…¯X01…1。
~n + 1 = ¯X…¯X10…0。
n & (~n + 1) = 0…010…0
4) 清最低位的bit1,其他不变。
n = n & (n – 1);
则 n – 1 = X…X01…1
n & (n - 1) = X…X00…0
5) 获得bit1的个数。(统计)
我们常用的方法:
int Get1BitCount(unsigned int x)
{
int n = 0;
while (x > 0) {
if (x & 0x1) n++;
x >>= 1;
}
return n;
}
另一种更好的办法:
int Get1BitCount(unsigned int x)
{
int n = 0;
while (x > 0) {
n++;
x = x & (x - 1);
}
return n;
}
6) 求unsigned int型数一共有多少bit?(网上看到有人问)
int nCount = Get1BitCount((unsigned int)~0);
求别的数据类型的位数,要重载Get1BitCount(或者直接用temlate来实现)。
不过觉得像上面这样求法,太浪费了,不是吗?
int GetTotalBit(void)
{
unsigned int x = ~0;
int n = 0;
while (x > 0) {
n += 8;
x >>= 8;
}
return n;
}
7) 清除低位到高位的n个bit1。
while (--n > 0) {
x = x & (x - 1);
}
8) (以后有再慢慢更新)
C/C bit 位操作相关推荐
- 《深入理解计算机系统》读书随笔-位操作
最近开始读<深入理解计算机系统>这本书.对于书中提到的从程序员的角度解读计算机系统这一说法非常感兴趣,所以决定好好读一读.从开始接触计算机编程就是站在一个高级语言的层次,虽然对编译原理,操 ...
- 计算机32位操作系统最大识别到内存,win7 32位系统可以支持多大的内存_win7 的32位系统最大支持多少g的内存...
大家都知道win7系统有32位和64位之分,而两者的安装配置是不一样的,一般4G内存的我们安装64位的系统,但是很多用户不知道win7 32位系统可以支持多大的内存,这就给大家分享一下win7 的32 ...
- java右移位_java、、移位操作方法
< int leftShift = 10; System.out.println("十进制:" + leftShift + ", 二进制:" + Inte ...
- python中二进制以什么开头_Python二进制表示和位操作
我们都知道在计算机中所有的信息最终都是以二进制的0和1来表示,而有些算法是通过操作bit位来进行运算的,这就需要我们了解Python中如何去表示二进制,又如何是进行位运算的. 二进制的表示 首先在Py ...
- 建立数组并写入数据_redis高并发利器:神奇的位操作,底层原理、数据结构剖析...
本文主要和大家分享一下redis的高级特性:bit位操作. 力求让大家彻底学会使用redis的bit位操作并掌握其底层实现原理!主要包含以下内容: redis位操作命令示例 底层数据结构分析 为什么他 ...
- 【c语言】位操作实现无符号整数的乘法运算
输入两个无符号整数x, y, 用位操作实现无符号整数的乘法运算.不用考虑整数的溢出. 输入: 235 657 输出: 154395 #include <stdio.h> #include ...
- 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed 参考文章: (1)解决wi ...
- VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案
VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作.解决方案 参考文章: (1)VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法 ...
- VM8不能安装64位操作系统原因解析
在64位的WIN7系统上,遇到64位系统无法在VMWARE8中安装的问题,刚开始以为是下载的ISO和VMWARE软件有问题.试了好几次发现,不管是Linux还是Windows,只要是64位系统都不能安 ...
- VMWare不能安装64位操作系统原因探析
您已经配置此虚拟机使用64位客户操作系统.然而,64位操作系统不可用.此主机具有虚拟化支持能力的,但虚拟化技术被禁用. 这通常是因为虚拟化技术已经在BIOS /固件设置或禁用或主机没有权限改变此设置. ...
最新文章
- node/js 漏洞_6个可用于检查Node.js中漏洞的工具
- 病从口入:土壤菌群如何影响肠道健康
- pybind11传输文件
- 3行代码,Python数据预处理提速6倍
- C++ 避免内存泄漏
- HYSBZ - 2157树链剖分
- 农场js_通过销售农场商品来解释Web API
- 利用用户级线程提高多线程应用的性能
- 微信多开txt_微信(电脑版)多开教程
- 基于JAVA+SpringBoot+Mybatis+MYSQL的在线动漫信息平台
- 关于用C#编写ActiveX控件3(转)
- linux空间满了有什么问题,Linux 空间满问题分析 [ Keep Coding ]
- Fibonacci算法
- 推荐 | 微软SAR近邻协同过滤算法拆解(二)
- sql 转html 中文乱码,SqlServer数据库中文乱码问题解决方法
- 17.3.13--pycharm2和3的常识问题
- 监听程序当前无法识别连接描述符中请求的服务_Linux I/O复用中select poll epoll模型的介绍及其优缺点的比较...
- 2345看图王总是弹窗广告怎么办?
- 我的世界java1.15更新了什么动物_我的世界:1.15版本这几种生物或许会加入,你期待哪种?...
- springboot项目打包报错
热门文章
- 用友uclient客户端下载手机_影院6080手机版-影院6080手机客户端下载
- 判断并输出三个数abc 中的最大值 (C语言)
- display none 隐藏后怎么显示_display:none与visibility:hidden的区别?
- idea导入ssm项目_一个简洁的适合 Java 小白练手的“秒杀”项目
- 面试基础(1)——面向对象/get,post的区别
- 电子政务档案管理系统源码_高校档案信息化建设的必要性
- Python的类和对象
- excel if函数 android,Excel函数公式:多条件判断你还在用If函数来实现,那就真的Out了...
- W10系统matlab无法保存对该路径的更改 pathdef_MATLAB的运行与窗口介绍
- linux oracle11g客户端安装