求解余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次方