zoukankan      html  css  js  c++  java
  • 图解 _INTSIZEOF(n)

    #define _INTSIZEOF(n)   ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 

    _INTSIZEOF(n) 整个做的事情就是将 n 的长度化为 int 长度的整数倍。

    1.~是位取反的意思。 ~(sizeof(int) - 1) )就应该为~(4-1)=~(00000011b)=11111100b,这样任何数& ~(sizeof(int) - 1) )后最后两位肯定为0,就肯定是4的整数倍了。

    2.(sizeof(n) + sizeof(int) - 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2),这样再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了。

      sizeof(n) 对应图2中 X 所处位置

      (sizeof(n) + sizeof(int) - 1)对应图4中 x+n-1所处的位置

          再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了即nq的位置


    理论基础

    对于两个正整数 x, n 总存在整数 q, r 使得

    x = nq + r, 其中 0<= r <n  //最小非负剩余

    q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是带余除法的一个简单形式。

    在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.

    所谓把 x 按 n 对齐指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n.

    如图1所示:

    当把 x 表示为:x = nq + r', 其中 -n < r' <=0    //最大非正剩余   

    nq 是我们所求。如图2所示:

    关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,然后加以处理:

    x+n = qn + (n+r'),其中 0<n+r'<=n       //最大正剩余

    如图3所示:

    x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n //最小非负剩余 所以 qn = [(x+n-1)/n]n. 用 c 语言计算就是:((x+n-1)/n)*n

    如图4所示

  • 相关阅读:
    论分治与归并思想
    关于缩短cin时间的方法
    【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)模版】
    getDomain(url)-我的JavaScript函数库-mazey.js
    jQuery-PHP跨域请求数据
    ASP-Server.Transfer-Response.Redirect
    jQuery获取相邻标签的值
    分界线<hr/>
    jQuery获取input复选框的值
    Bootstrap支持的JavaScript插件
  • 原文地址:https://www.cnblogs.com/polestar/p/2365013.html
Copyright © 2011-2022 走看看