位运算

来源:互联网 发布:淘宝店铺招牌尺寸 编辑:程序博客网 时间:2024/06/14 07:17
  • 将二进制转换为十进制
int deci[101];int Bin2Dec(int a[],int n){    int ans = 0;    for(int i = 1; i <= n; ++i)    {        ans *= 2;        ans += a[i];    }    return ans;}int main(void){    int n;//n位二进制数    scanf("%d",&n);//输入    for(int i = 1; i <= n; ++i)        scanf("%1d",&deci[i]);//一次只读一位    printf("%d\n",Bin2Dec(deci,n));//打印    return 0;}
  • 按位与(&)
    应用:按位与运算通常用于二进制取位操作。例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶。二进制的最末位为0表示该数为偶数,最末位为1表示该位为奇数。
  • 按位或(|)
    按位或运算通常用于二进制特定位上的无条件赋值。例如一个数 or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数 or 1之后再减1就可以了,其实际意义就是把这个数强行变成最接近的偶数
  • 按位异或(^)
    ①xor的直观意思就是“是不是不一样”。
    ②0 ^ 0 = 0
    0 ^ 1 = 1
    也就是说一个数异或0还等于它本身
    ③n^ n =0
    也就是说一个数异或它本身等于0
    ④异或运算的逆运算就是它本身,也就是说异或同一个数的最后结果不变。
    即(a xor b)xor b = a
    PS:a b b之间任意顺序
    ⑤异或的另一个用处是交换两个整数,不用临时变量
    例如:
    a = a ^ b;
    b = b ^ a;
    a = a ^ b;
  • 按位取反(~)
    使用取反运算时要特别小心,需要注意整数类型有没有符号。有符号的整数类型与无符号的整数取反结果是不一样的。
    对于无符号类型,取反后的效果就是把这个数在数轴上的位置“对称翻折到另一边去”;
    而对于有符号的类型,取反后最高位的变化导致了正负颠倒,又因为负数储存使用补码,所以效果就是变为-a-1

  • bitset位集合容器

#include<bitset>bitset<n> b;//b有n位,每位都为0bitset<n> b(unsigned long u);//如:bitset<5> b(5);//则b为“10100”bitset<n> b(string s);//b有n位,并用u赋值;如果u超过n位,则顶端被截除。string temp = "1010111100";bitset<10> b(temp);b[0]为最低位,而字符串s是符合习惯,从左到右依次填入的b.count();//二进制为1的个数b.size();//总长度b.flip()//二进制位依次取反b.set()//将所有位全置为1b.reset();//将所有位全置为0b.test(0);//判断第0位是否为1
  • 小知识
    ①2^n有n+1位
    ②右移时,需注意符号位问题,务必确保对非负整数进行运算,否则会出错。例如当A=-1时,对于任何位移运算A>>B,结果都是-1。
    ③-1的二进制形式为1111……1111
    ④注意应对unsigned类型取反
    ⑤十进制表示:Dec。十六进制表示:Hex。八进制表示:Oct
    ⑥计算机用0x00000000到0x7FFFFFFF依次表示0到2147483647的数,剩下的0x80000000到0xFFFFFFF依次表示-2147483647到-1的数
    ⑦十进制小数转为N进制数,转换的方法是“乘N顺序取整”
    ⑧将int型整数看做32位二进制数
    位运算的优先级很低 所以必须加括号!!!
    ⑩把一个数字二进制下最靠右的第一个1去掉。方法:x=x&(x-1)
原创粉丝点击