C++位操作

C++位操作

位操作有哪些

实际上并不多:

& 逻辑与

| 逻辑或

~ 逻辑非

^ 逻辑异或

<<左移

>>右移

二进制数

C++貌似不支持二进制数的定义,但是不要紧,我们完全可以使用十进制数,但是脑内模拟二进制数

奇技淫巧
  1. 二进制数求指数:
    m >>= n  将m除2^n
    m <<= n  将m乘以2^n
    注意:负奇数的除法是向上取整,右移是向下取整,即:-3 / 2 = -1,-3>>2 = -2
  2. 二进制中1的个数求解:(m = m&(m - 1))每次执行一次这个操作,最右边的1将变为0,因此可以计数1的个数

    例:101执行一次后变为100,再执行一次后变为000

    1101执行一次后变为1100,再执行一次后变为1000,再执行一次后变为0000

  3. 判断奇偶数:x & 1 == 1(判断是否为奇数)
    偶数最右为0,奇数为1,
  4. 交换两个数(无需新变量):
    x = x ^ y;
    y = x ^ y;
    x = x ^ y;
    
  5. 判断符号(正负性)是否相同:(x ^ y) >= 0同负同正时,异或为假—>即结果为0,即:符号位得0(即正数),结果大于0
  6. 改变二进制的第n位数:
    x |=(1<<n) 		//第n位改为1  	//注:0位为最右边的那位
    x &=(~(1<<n))	//第n位改为0	//注:虽然是二进制运算,但实际上是拿十进制去算
    

    如将1101B(13D)的第1位改为1:13|(1<<1)—>结果为1111即:15