zoukankan      html  css  js  c++  java
  • 位运算及其编程妙用

    Bitwise Operators

    介绍

    位操作符通常用来对操作数进行位级的操作运算。首先将运算符转换为位级,然后对操作数执行计算。可以在比特级执行诸如加法,减法,乘法等的数学运算以便更快地处理。

    在C语言中,有6种位操作符(在比特级运算)。

    • &(bitwise AND):与。两个操作数,在两个操作数上的每个比特上进行AND操作。只有两个比特都是1时,运算结果才是1。
    • |(bitwise OR):或。两个操作数,在两个操作数上的每个比特上进行OR操作。只要有一个比特为1,运算结果为1。
    • ~(bitwise NOT):非。单元操作符。只要一个操作数。翻转比特位-0变1,1变0.
    • ^(bitwise OXR):异或。两个操作数。在两个操作数上的每个比特上进行XOR操作。如果两个比特位不相同,运算结果为1.
    • <<(left shift):左移。两个操作数。要左移的数以及左移的位数。
    • (>>)(right shift):右移。两个操作数。要右移的数以及右移的位数。
    #include<stdio.h> 
    int main() 
    { 
        unsigned char a = 5, b = 9; // a = 5(00000101), b = 9(00001001) 
        printf("a = %d, b = %d
    ", a, b); 
        printf("a&b = %d
    ", a&b); // The result is 00000001 
        printf("a|b = %d
    ", a|b);  // The result is 00001101 
        printf("a^b = %d
    ", a^b); // The result is 00001100 
        printf("~a = %d
    ", a = ~a);   // The result is 11111010 
        printf("b<<1 = %d
    ", b<<1);  // The result is 00010010  
        printf("b>>1 = %d
    ", b>>1);  // The result is 00000100  
        return 0; 
    } 
    

    运算结果:

    a = 5, b = 9
    a&b = 1
    a|b = 13
    a^b = 12
    ~a = 250
    b<<1 = 18 	
    b>>1 = 4
    
    

    特性

    1. 左移和右移操作符不能用在负数上。如果两个操作数其中一个为负数,将会导致undefined行为。如-1<<1 或1<<-1.而且,如果移动的位数超过数的范围,也会导致undefined行为。如1<<33. 出错。
    2. 从面试上说XOR异或操作是最常见的知识点。主要性质:任意数和自身异或结果为0;0和任意数n异或结果还是本身n.
      eg:“Given a set of numbers where all elements occur even number of times except one number, find the odd occurring number.”给一个数组,数组元素除了一个元素外都出现偶数次,找到出现奇数次的元素。
    int findOdd(int arr[], int n)
    {
    	int res = 0,i;
    	for(i=0;i<n;i++)
    		res ^= arr[i];
    	return res;
    }
    
    1. 位操作符不能用来替换逻辑运算符。逻辑运算符(&&,||,和!)运算结果为0或1.但位操作符运算结果为整数。而且逻辑运算符将任意非0值视为1.
    2. 左移和右移分别等价于乘2和除以2.
    3. & 运算符可以用来快速检测一个数的奇偶性. x & 1表达式的值如果非0,则x是奇数;反之为偶数。
    int main(){
    	int x = 19;
    	(x & 1)? printf("Odd"):printf("Even");
    	
    	return 0;
    }
    
  • 相关阅读:
    Sublime Text3 无法调出package controll问题
    Python标准库-enumerate用法
    设计模式学习-简单工厂模式(python3)
    【IO流】java中文件路径(相对路径、绝对路径)相关类及方法
    nginx安装教程(详细)
    nginx -stream(tcp连接)反向代理配置 实现代理mysql以及文件上传
    【单例模式】懒汉式的线程安全问题 volatile的作用
    jsonp协议 java服务端、JQuery客户端 简单实现原理
    MyBatis原理,Spring、SpringBoot整合MyBatis
    【JavaSE】运行时类型信息(RTTI、反射)
  • 原文地址:https://www.cnblogs.com/ysugyl/p/9630400.html
Copyright © 2011-2022 走看看