首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求解短8的算法

2013-01-04 
求解余8的算法看到一个余8的算法不甚理解,谁给解释一下,最好类推一下余(2,3,4....n)的方法.unsigned char

求解余8的算法
看到一个余8的算法不甚理解,谁给解释一下,
最好类推一下余(2,3,4....n)的方法.


unsigned char ch;
unsigned char x;
unsigned char y;
x= ch >> 3;      /* ch除8,这个好理解 */
y = ch & 0x07;   /* ch余8,不理解     */

[解决办法]

unsigned char ch;
unsigned char x;
unsigned char y;
x= ch >> 3;      /* ch除8,这个好理解 */
y = ch & 0x07;   /* 8为0x1000, 看ch最后三为为啥,即为余数 ch&0x07即保留最后三位*/


[解决办法]
ch&0000 0111即ch最后三位保持不变 其它位清零, 
0000 1000即为8的整数倍 所以除8的商可以表示为:ch>>3
2,3....n没有想到有什么办法好类推出去,期待专家解答.....
[解决办法]
2^n 都有快速算法 即ch & (2^n -1)
就像这样

要对它求余的数 2 4 8 16 32 64
改为与它的数 1 3 7 15 31 63
    
通用的就用%(mod 求余数除法)去做吧
unsigned char ch; unsigned char x; unsigned char y; 
x= ch >> 3;      /* ch除8,这个好理解 */
y = ch & 0x07;   /* ch余8,不理解     */
8=2^3 所以7=8-1 占3Bit而且全1 二进制表示: 111,
unsigned char ch 通常是 8Bit 于是 7=0x07 二进制表示:00000111
ch&0x07  左边5Bit与0相与所以全为0 ,
右边3Bit与1相与,所以保留右3Bit
 1)xxxxx xxx & 00000111 =00000 xxx
 2)xxxxx xxx -  xxxxx 000=00000 xxx
 3)xxxxx xxx %00001 000 =00000 xxx  
 因为
 4)xxxxx 000 /00001 000 =000xxxxx
 5) xxxxx xxx /00001 000 =000xxxxx
 所以1)2)3)所得结果相同
 所以 ch&0x07  =ch- ch/8 *8 =ch %8 
 通用的求余如下,2某次幂 如8,用它减一的结果  8-1=7 与被求余的数相与  
    2:ch%2 =>ch&1
    3:ch%3
    4:ch%4 =>ch&3
    5:ch%5
    .
    8:ch%8 =>ch&7
    .
    n:ch%n     
                             

[解决办法]
0x07 为 0000 0111,即用一个数与0x07与的意思就是说保留一个数的最低3位,因为最高的几位都是8的倍数,明白了么?
[解决办法]
mod 2:
x = ch >> 1;
y = ch & 0x01;

mod 4:
x = ch >> 2;
y = ch & 0x03;

mod 8:
x = ch >> 3;
y = ch & 0x07;

...
mod 2n(n次方)
x = ch >> n;
y = ch & (2n - 1); 2n为2的的n次方


热点排行