当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++位操纵概述

C++位操纵概述

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:53

界说二进制变量:

一般是以八进制可能十六进制来界说,八进制数以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的移动位数是未界说的行为(见上面移位操纵那部门红字注释)

作者:cnblogs tenos

 

    关键字:


天才代写-代写联系方式