定义二进制变量:

一般是以八进制或者十六进制来定义,八进制数以0开头,十六进制数以0x开头

例如int  a = 0x80, 这里的80只能表示8个二进制位,它表示的是int的低8位,前面的24个二进制位补0,所以a = 128;也可以 a = –0x80, 此时a = -128;8进制同理

需要注意的是:如果0x…能够在整形内表示,则其默认是int,否则再看unsigned int能否表示,接着long long ,再接着unsigned long long (可以用cout<<typeid(0xF0).name();查看变量类型)

关于移位操作:

<< 左移位操作:从右边开始用0补空位

>>右移位操作:对于无符号数从左边开始补0;对于有符号数,或者补符号位,或者补0,由编译器决定(gcc的编译器是补符号位)

注意:移位的数目是负数或者移位出界时(最多只能移位类型二进制位大小-1),这个操作符的行为是未定义的,可以参考C++移位运算符,位操作只针对整数类型(int long等)或者char类型的数据

 

常用二进制位操作(如果没强调,expr可以是无符号或有符号整数):具体请参考c_c++刁钻问题各个击破之位运算及其实例(2)

1.        将expr的第n(n从0开始)位设置为1:  expr |= (1<<n);

2.        将expr的第n(n从0开始)位设置为0:    expr &= (~(1<<n));

3.        判断expr的第n(n从0开始)位是否为1:bool b = expr &(1<<n);

4.        翻转expr的第n(n从0开始)位:expr ^= (1<<n);

5.        将最右侧的1翻转成0:expr &= (expr-1)  (可以用来判断二进制中1的个数,每次翻转一个1,知道数字变为0)                               本文地址

6.        向右连续传播最右侧的1位:expr |= (expr-1)  (该操作使00101000 变为 00101111)

7.        检查无符号数expr是否是2的整数次幂:if((expr&(expr-1))==0)return true; 即说明expr的二进制中只有一个1

8.        将右侧的连续1位串翻转成0位串,其他保持不变:expr = ((expr|(expr-1))+1)&expr

9.        检查无符号整数expr是否等于2的两个整数次幂之差 if(((expr|(expr-1))+1)&expr == 0)return true;  (只要说明:无符号数二进制中所有的1都在一起)

10.      对于整数expr,求最小的、比expr大的整数M,使得M与expr的二进制表示中有相同数目的1, 如下,具体可参考给力!高效!易懂!位运算求组合

int NextN(int N)
{
    int x = N&(-N);     
    int t = N+x;
    return t | ((N^t)/x)>>2;
}

需要注意的是:如果没有比expr大且二进制中1相同的数,函数返回-1

 

11.        循环移位,以整形举例,循环左移和右移函数如下

int rotateLeft(int a, unsigned int n)//循环左移n位
{
    n %= 32;
    if(n == 0)return a;
    return (a << n) | ((a & 0xFFFFFFFF) >> (32 - n));
}

int rotateRight(int a, unsigned int n)//循环右移n位
{
    n %= 32;
    if(n == 0)return a;
    return ((a & 0xFFFFFFFF) >> n) | (a << (32 - n));
}

例如:

a = 01111011,循环左移2位的正确结果是: b=11101101

b = a >> (8 - 2); //用来得到正常左移丢失的位和循环移位后其正确位置 //b=00000001;

a = a << 2; //a = 11101100

a = a | b; //a = 11101101

注意1:按照上面的例子,我们需要的是右移操作右边补0;但是如果输入是个负数,c++没有规定右移操作是怎么补位的,而大部分编译器是补符号位,所以此时需要把这个负数转化成无符号整数,这就是a & 0xFFFFFFFF的作用(0xFFFFFFFF的类型是unsigned int)

注意2:当n 超过32时,需要n = n%32 这相当于循环移了好几圈;另外如果n = 0,那么32-n = 32,而整数移位操作对于大于31的移动位数是未定义的行为(见上面移位操作那部分红字注释)

 

【版权声明】转载请注明出处http://www.cnblogs.com/TenosDoIt/p/3695166.html

C++ 中的位操作的更多相关文章

  1. 深入Java中的位操作

    「WTF系列」深入Java中的位操作 关于WTF系列 引 学完本章节你将学会位的基础概念与语法,并且还会一些骚操作!! 与.或.非.位移 原码.反码.补码 字节.位.超区间...... 开始本章节之前 ...

  2. 二进制知识(java中的位操作)

    文章目录 前言 机器数 真值 原码 反码 补码 计算机中保存的都是补码 位操作 强制转换,精度丢失 前言 讲二进制的东西,必须要说明是多少位机器,八位机上的 1000 1000 和 十六位机上的 10 ...

  3. java中的位操作

    之前做项目的时候使用位操作不是很多,今天在刷leetcode上题目的时候用到了位操作,是leetcode中的第29题Divide Two Integers. 一.java的位操作: 位运算表达式由操作 ...

  4. JS中的位操作在实际项目中的应用

    前言: Linux中的文件管理子系统的权限管理,想必大家都知道:rwx分别代表read(可读),write(可写), execute(可执行,如果是可执行程序的话),其中rxw可以按照数字表示: r  ...

  5. C语言中的位操作(14)--反转比特位

    本篇文章主要讲述几种反转比特位的方法: 将一个32位数:abcd efgh 转置为hgfe dcba 1.常规方法 unsigned int v; // 目标待转置数 unsigned int r = ...

  6. javascript中按位操作的应用,如何快速取整 判断字符串是否是包含某字符串

    最近在看最基础的<javascript高级程序设计>看的灰常慢,看到按位运算这里,突然反思,这种鬼操作到底有什么实际的应用呢? 按位运算符有6个 & 按位与:a & b | ...

  7. netty中的位操作

    看了PoolChunk源码,好多位操作,对这些位操作理解不到位,看起来很是吃力,不知道为什么要这么做,可能是性能更好 1:大小为2 的冥的数加1 怎么操作 size^1; 2: <=比较   m ...

  8. C语言中的位操作(16)--计算二进制数字尾部连续0的数目

    本篇文章介绍计算二进制数字尾部连续0的数目的相关算法,例如:v=(1101000)2,该数尾部连续0的数目=3 方法1:线性时间算法 unsigned int v; // 需要计算的目标整数 int ...

  9. C语言中的位操作(12)--判断一个数字是否包含一个全零字节

    本文主要介绍一系列算法,算法主要功能是判断一个数字(二进制)中是否包含全零字节 e.g.1010 1111 0000 0000 1001 1111 0001 1111 即 32位整数:A4A3A2A1 ...

随机推荐

  1. hdu3308

    区间合并比较模板的题,就是求一个区间的LCIS 线段树维护左最大LCIS,右最大LCIS,区间LCIS 看代码就行 #include<iostream> #include<cstri ...

  2. python3 + selenium 之警告和弹窗

    获取警告框信息 texts = driver.switch_to_alert().text #获取警告文本 print(texts)#得到弹窗的文本消息,比如得到:请输入用户名! 使用switch_t ...

  3. 《转》MySQL 5.7版本新特性连载

    MySQL 5.7版本新特性连载(一) 本文将和大家一起分享下5.7的新特性,不过我们要先从即将被删除的特性以及建议不再使用的特性说起.根据这些情况,我们在新版本及以后的版本中,应该不再使用,避免未来 ...

  4. jeecg Export导出图片到excel

    import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  5. javafx的scene大小不能在控制器中设置

    做个记录,备忘 遇到一个问题,点击提交,红色标识的VBox大小不能改变.问题如图,代码如下 点击后 fxml结构简化代码: 红色框体对应vboxMax <VBox fx:id="vbo ...

  6. Ext.js入门:TreePanel(九)

    一:最简单的树 二:通过TreeNode自定义静态树 三:用TreeLoader加载数据生成树 四:解决IE下非正常加载节点问题 五:使用TreeNodeUI 六:带有checkbox的树 七:编辑树 ...

  7. django url解析中的ResolverMatch

    了解这个问题,源于昨天开发时遇到的一个小小的问题. 问题描述如下: 比如,我有一个url,定义如下: path('res_edit/<app>/<env>/', AppResE ...

  8. 2733: [HNOI2012]永无乡

    题解: 爬到了bzoj的数据哈哈哈哈 然后提交上去t了 自己测只有1秒多呀 不理解 然后这题目就是个线段树/平衡树合并裸题 来练一下线段树合并 据说是nlogn的 #include <bits/ ...

  9. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  10. BZOJ1965 [Ahoi2005]SHUFFLE 洗牌 快速幂

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1965 题意概括 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取 ...