zoukankan      html  css  js  c++  java
  • 位运算 技巧1

    如果要对一个整数中的某些位进行操作,怎样表示这些位在整数中的位置呢?可以用掩码(Mask)来表示。比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作,举例如下。

    1、取出8~15位。

    unsigned int a, b, mask = 0x0000ff00;
    a = 0x12345678;
    b = (a & mask) >> 8; /* 0x00000056 */

    这样也可以达到同样的效果:

    b = (a >> 8) & ~(~0U << 8);

    2、将8~15位清0。

    unsigned int a, b, mask = 0x0000ff00;
    a = 0x12345678;
    b = a & ~mask; /* 0x12340078 */

    3、将8~15位置1。

    unsigned int a, b, mask = 0x0000ff00;
    a = 0x12345678;
    b = a | mask; /* 0x1234ff78 */

    使用移位运算来避免乘法运算是一种常用技巧,不过乘数必须都是正整数,而且必须至少有
    一个是 2 的 n 次方,例如:2,4,8,16,32……移位运算的特点是速度快,而乘法运算速度较慢,
    把乘法运算转化为移位运算可以稍微提高程序运行效率。例如:

            num *= 32;
            等同于
            num <<= 5; /* 2 的 5 次方等于 32 */

    如果乘数不是 2 的 n 次方,我们可以把乘数分解成几个 2 的 n 次方的和:
            num *= 20; 
            等于
            num *= (16 + 4);
            等于
            num = num * 16 + num * 4; 
            等于
            num = (num << 4) + (num << 2);

    不过,现在的编译器很聪明,它们会代替我们做这种优化。也就是说,如果我们写的语句是:
            num *= 100;
    编译器会把这个语句优化为:
            num = (num << 6) + (num << 5) + (num << 2);

    所以,我们没有必要手工进行这种优化,因为编译器会替我们完成。而且,就算进行了这种优化,速度也不会
    有太大提高。我们应该把精力用来改进算法,一个好的算法可以让程序运行效率大大提高! 

      但是凡事都有一个度,采用移位运算,要注意不要超过该数据类型的精度(数据范围),比如请看下面一个例子(C++版)

    #include <stdio.h>

    void main()
    {
     int a=-2147483647;

     a=a<<1;

     printf("%d /n",a);
    }
    猜下结果是多少,呵呵......

    上面的那个程序,我们要注意精度问题,在32级win32 int型占4个字节,精度范围在(-2147483648,2147483647)直接,上面的刚好处于下限,我如果说结果是2很让初学者感到困惑.但如果我们静下心来仔细看看最基本的计算机基础知识,其实很简单.....

    -2147483647
    原码:11111111111111111111111111111111(32个1)
    补码:10000000000000000000000000000001

  • 相关阅读:
    windows加固
    linux加固
    加密与编码
    XSS笔记
    hackbar功能简介
    机器学习 | 从加法模型讲到GBDT算法
    把时间还给洞察,且看PPT调研报告自动生成攻略
    树莓派3折腾笔记
    看数学老师是如何一键搞定报告和试卷的
    博客笔记(blog notebook)
  • 原文地址:https://www.cnblogs.com/youxin/p/3295771.html
Copyright © 2011-2022 走看看