zoukankan      html  css  js  c++  java
  • C语言中的位操作(12)--判断一个数字是否包含一个全零字节

    本文主要介绍一系列算法,算法主要功能是判断一个数字(二进制)中是否包含全零字节

    e.g.1010 1111 0000 0000 1001 1111 0001 1111

    即 32位整数:A4A3A2A1中Ai =0(i=1 or 2 or 3 or 4)

    // 较少操作算法版本:
    unsigned int v; // 32位整型目标整数判断是否包含全0字节
    bool hasZeroByte = ~((((v & 0x7F7F7F7F) + 0x7F7F7F7F) | v) | 0x7F7F7F7F);

    原理:

    0x7F7F7F7F=0111 1111 0111 1111 0111 1111 0111 1111

    v & 0x7F7F7F7F:将v的第8、16、24、32位都置为0,其余位不变

    我们不妨设A2=0

    执行完 (v & 0x7F7F7F7F)+0x7F7F7F7F , A2=0111 1111

    再执行(v & 0x7F7F7F7F)+0x7F7F7F7F | v, A2=0111 1111

    执行 ((v & 0x7F7F7F7F)+0x7F7F7F7F | v) | 0x7F7F7F7F, A2=0111 1111

    最后执行 ~(((v & 0x7F7F7F7F)+0x7F7F7F7F | v) | 0x7F7F7F7F) A2=1000 0000 !=0

    hasZeroByte=true

    操作步骤较多的算法:

    bool hasNoZeroByte = ((v & 0xff) && (v & 0xff00) && (v & 0xff0000) && (v & 0xff000000))

    或者如下的算法:

    unsigned char * p = (unsigned char *) &v;  
    bool hasNoZeroByte = *p && *(p + 1) && *(p + 2) && *(p + 3);

    原理比较简单

  • 相关阅读:
    LeetCode 面试题56-I
    LeetCode T2
    统计中的AUC和ROC曲线
    【转载】RNN
    One layer SoftMax Classifier, "Handwriting recognition"
    【转载】深度学习中softmax交叉熵损失函数的理解
    【转载】softmax的性质及其实现
    logistics多分类
    logistics二分类
    多元线性回归
  • 原文地址:https://www.cnblogs.com/xueda120/p/3147406.html
Copyright © 2011-2022 走看看