qianmowanjidebi.jpg

鸽子的我又来更新了~

程序中的所有数在计算机内存中都是以二进制的形式储存的。

位运算就是直接对整数在内存中的二进制位进行操作

为什么用?因为他快啊!


运算符示例作用
& (与)a&ba和b的二进制中表示中,相同位的两个数字都为1,才能是1
| (或)a|b相同位只要一个为1即为1
︿ (异或)a︿b如果某位不同则该位为1,否则该位为0
~ (取反)~a0和1全部取反
<< (左移)a<<b就表示把a转为二进制后左移b位(在后面添b个0)
>> (右移)a>>b表示二进制右移b位(去掉末b位)


----------------------------------------------------------------------------------------------------------------------

第三级别(既有右结合性)
!    逻辑取反
not!的另一种表达
~按位取反

  

第五级别
乘法
/除法
%取余数(横运算)
第六级别
 +加法
 -减法
第七级别
<<位左移
>>位右移
第八级别
<小于
<=小于等于
>大于
>=大于等于
第九级别
 ==恒等于
 eq恒等于
 !=不等于
not_eq不等于
第十级别
&位且运算
bitand位且运算
第十一级别
︿位异或运算
xor位异或运算
第十二级别
|位或运算
bitor位或运算

--------------------------------------------------------------------------------------------------------------------------------

与应用

&运算:通常用于二进制取位操作

int A;
cin>>A;
if(a&1)
    cout<<"奇数";
else
    cout<<"偶数"

A&1的结果就是取A的二进制的最末位

--------------------------------------------------------------------------------------------------------------------------------

进制输入输出

头文件 :iomanip

dec:十进制

hex:十六进制

oct:八进制

%d:十进制

%x:十六进制

%o:八进制

//十六进制
int a;
a=0x0027;
cin>>hex>>a;
a=027;
cin>>oct>>a;
cin>>dec>>a;
cout>>oct>>a;
printf("%x",a);
printf("%o",a);

--------------------------------------------------------------------------------------------------------------------------------

#include<iostream>
#include<cstdio>
#include<climits>
using namespace std;
int main(){
    cout<<INT_MAX<<endl;
    cout<<hex<<TNT_MAX<<endl;
    cout<<dec<<TNT_MIN<<endl;
    cout<<hex<<TNT_MIN<<endl;
    int a=0xffffffff;
    cout<<dec<<a<<endl;
    return 0;
}
输出为:
2147483647
7fffffff
-2147483648
80000000
-1

--------------------------------------------------------------------------------------------------------------------------------

求反应用

int main(){
    int a=-7;
    int b=~a;
    cout<<b<<endl;
    a=7;
    b=~a;
    cout<<b<<endl;
    return 0;
}9
输出:
6 -8

对一个有符号的数进行求反运算后,最高位的变化将导致正负颠倒,并且数的绝对值会差1。也就是说,~a实际上等于-a-1。

--------------------------------------------------------------------------------------------------------------------------------

右移运动

a>>b就表示把a转为二进制后右移b位。正数高位补0,负数高位补1.

相当于a除以2的b次方(取整)。

我们也经常用>>1来代替除2操作。

--------------------------------------------------------------------------------------------------------------------------------

取某些位:

int a=0x29; //(101001)2
  1. 取末位:

    a&1

int main(){
    int a=109;
    cout<<(a&1);
    return 0;

 2.取末三位:

  a&(111)下标2

  a&(1000-1)下标2

  a&((1<<3)-1)

  3.取末k位:

  a&((1<<k)-1)

--------------------------------------------------------------------------------------------------------------------------------

 int a=0x29; //(101001)下标2

 4.取右数第三位:

  a>>2&1

 5.取右数第k位:

(a>>k-1)&1

给某些位赋值:(赋1)

int a=0x2A; //(101010)下标2

 1.最后一位变成一:

  a|1

 2.把右数第三位变成一:

  a|1<<2

--------------------------------------------------------------------------------------------------------------------------------

给某些位赋值:(赋0

int a=0x29; //(101001)下标2
  1. 最后一位变成0:

   (a|1)-1

   2.把右数的第四位变成零:

   a&~(1<<3)

   3.把右数第k位变成零

   a&~(1<<k-1)

--------------------------------------------------------------------------------------------------------------------------------

给某些位赋值:(求反)

int a=0x29; //(101001)下标2

  1、最后一位求反:

  a^1

  

  2、右数第3位求反:

  a^1<<2


  3、右数第k位求反:

  a^1<<k-1

--------------------------------------------------------------------------------------------------------------------------------

  1.如何O(1)的时间将一个数X的最低位的1去掉?

  例如:

  X=6 其二进制为:(110)下标2

  X去掉最低位的1为:(110)下标2

  x&(x-1)

  2.如何O(1)的时间只保留一个数X的最低位的1?

  例如:

  X=6 其二进制为:(110)下标2

  X只保留最低位1为:(10)下标2

  说明:

lowbit(x)=x&(~x+1)

--------------------------------------------------------------------------------------------------------------------------------

补码中:

~x+1=-x

lowbit(x)=x&-x


XM.O-内部文章-请勿转载-谢谢


#转载请注明出处!