user-0 提问: 怎么按位与实现数据对齐。。 

回复:
user: user-1
content: 坚决消灭零恢复。

user: user-2
content: ((ulong)char_ptr & (sizeof(ulong) - 1)) == 0表示与ulong对齐，例如： 假如a为一个2^n的数，那么测试一个数b与上a-1是否为0，则可以判断b是否是与n位对齐的数。 a = 2 ^ n if((b & (a - 1)) == 0   引用 楼主 u012559195 的回复:要求：判断一个字符直到内存对齐，如果在内存对齐之前就遇到'\0'则直接return typedef unsigned long  ulong;     size_t strlen_c(const char * str)     {           const char * char_ptr;       const ulong * longword_ptr;       register ulong longword, magic_bits;        for (char_ptr =  str; ((ulong)char_ptr& (sizeof(ulong) - 1)) != 0 ;++ char_ptr)           {              if (*char_ptr == '\0' )                   return char_ptr -  str;                  }     }    问题： for (char_ptr =  str; ((ulong)char_ptr& (sizeof(ulong) - 1)) != 0 ;++ char_ptr)  这个怎么实现数据对齐呢？ PS：数据对齐(data alignment)，是指数据所在的内存地址必须是该数据长度的整数倍，这样CPU的存取速度最快。比如在32位的计算机中，一个WORD为4 byte，则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下：对于n字节(n = 2,4,8...)的元素，它的首地址能被n整除才能获得最好的性能。

user: user-0
content: 引用 6 楼 mujiok2003 的回复:假设sizeof(ulong) = 4, 则sizeof(ulong)-1= 3 = 0x03(二进制位0000 0011) 地址char_ptr & 0x03的结果是只保留地址的低2位,如果char_ptr & 0x03 = 0, 那么说明地址的低两位都是0，第一个非0的位置至少是第三位 地址的形式是: xxxx xxxx  xxxx xx00，那么肯定是4字节对齐了的。  明白了，谢谢啊。

user: user-3
content: 假设sizeof(ulong) = 4, 则sizeof(ulong)-1= 3 = 0x03(二进制位0000 0011) 地址char_ptr & 0x03的结果是只保留地址的低2位,如果char_ptr & 0x03 = 0, 那么说明地址的低两位都是0，第一个非0的位置至少是第三位 地址的形式是: xxxx xxxx  xxxx xx00，那么肯定是4字节对齐了的。

user: user-4
content: 引用 4 楼 u012559195 的回复:[quote=引用 1 楼 turingo 的回复:] ((ulong)char_ptr & (sizeof(ulong) - 1)) == 0表示与ulong对齐，例如： 假如a为一个2^n的数，那么测试一个数b与上a-1是否为0，则可以判断b是否是与n位对齐的数。 a = 2 ^ n if((b & (a - 1)) == 0   [quote=引用 楼主 u012559195 的回复:] 要求：判断一个字符直到内存对齐，如果在内存对齐之前就遇到'\0'则直接return typedef unsigned long  ulong;     size_t strlen_c(const char * str)     {           const char * char_ptr;       const ulong * longword_ptr;       register ulong longword, magic_bits;        for (char_ptr =  str; ((ulong)char_ptr& (sizeof(ulong) - 1)) != 0 ;++ char_ptr)           {              if (*char_ptr == '\0' )                   return char_ptr -  str;                  }     }    问题： for (char_ptr =  str; ((ulong)char_ptr& (sizeof(ulong) - 1)) != 0 ;++ char_ptr)  这个怎么实现数据对齐呢？ PS：数据对齐(data alignment)，是指数据所在的内存地址必须是该数据长度的整数倍，这样CPU的存取速度最快。比如在32位的计算机中，一个WORD为4 byte，则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下：对于n字节(n = 2,4,8...)的元素，它的首地址能被n整除才能获得最好的性能。[/quote]可是地址不一定是2^n的数。能再讲详细点吗？你举的这个例子我能理解，但是觉得你的例子太特殊了。[/quote] n不就是2，4，8，等，难道不是2^n？

user: user-0
content: 引用 1 楼 turingo 的回复:((ulong)char_ptr & (sizeof(ulong) - 1)) == 0表示与ulong对齐，例如： 假如a为一个2^n的数，那么测试一个数b与上a-1是否为0，则可以判断b是否是与n位对齐的数。 a = 2 ^ n if((b & (a - 1)) == 0   [quote=引用 楼主 u012559195 的回复:] 要求：判断一个字符直到内存对齐，如果在内存对齐之前就遇到'\0'则直接return typedef unsigned long  ulong;     size_t strlen_c(const char * str)     {           const char * char_ptr;       const ulong * longword_ptr;       register ulong longword, magic_bits;        for (char_ptr =  str; ((ulong)char_ptr& (sizeof(ulong) - 1)) != 0 ;++ char_ptr)           {              if (*char_ptr == '\0' )                   return char_ptr -  str;                  }     }    问题： for (char_ptr =  str; ((ulong)char_ptr& (sizeof(ulong) - 1)) != 0 ;++ char_ptr)  这个怎么实现数据对齐呢？ PS：数据对齐(data alignment)，是指数据所在的内存地址必须是该数据长度的整数倍，这样CPU的存取速度最快。比如在32位的计算机中，一个WORD为4 byte，则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下：对于n字节(n = 2,4,8...)的元素，它的首地址能被n整除才能获得最好的性能。[/quote]可是地址不一定是2^n的数。能再讲详细点吗？你举的这个例子我能理解，但是觉得你的例子太特殊了。

user: user-0
content: [quote=引用 1 楼 turingo 的回复:] ((ulong)char_ptr & (sizeof(ulong) - 1)) == 0表示与ulong对齐，例如： 假如a为一个2^n的数，那么测试一个数b与上a-1是否为0，则可以判断b是否是与n位对齐的数。 a = 2 ^ n if((b & (a - 1)) == 0)  可是地址不一定是2^n的数。能再讲详细点吗？你举的这个例子我能理解，但是觉得你的例子太特殊了。