二进制可分性为10

时间:2012-09-10 17:13:43

标签: binary division

如何检查二进制数是否可以除以10(十进制),而不将其转换为其他系统。 例如,我们有一个数字:

1010 1011 0100 0001 0000 0100

我们如何检查这个数字是否可被10整除?

3 个答案:

答案 0 :(得分:3)

  

首先将数字分成奇数和偶数位(我称之为“偶数”)   对应于2)偶数幂的位:

     

100100110010110000000101101110       0 1 0 1 0 0 1 0 0 0 1 1 0 1 0偶数1 0 0 1 0 1 1 0 0 0 0 0 1 1 1奇数

     

现在,在每个中,交替地加上和减去数字,如   十进制11的可分性标准测试(以。开头)   在右边添加):

     

100100110010110000000101101110 + 0-1 + 0-1 + 0-0 + 1-0 + 0-0 + 1-1 + 0-1 + 0 =   -2 + 1-0 + 0-1 + 0-1 + 1-0 + 0-0 + 0-0 + 1-1 + 1 = 1

     

现在将奇数位的总和加倍并将其加到偶数之和   位:

     

2 * 1 + -2 = 0

     

如果结果可以被5整除,就像在这种情况下,数字本身就是   可被5整除。

     

因为这个数字也可以被2整除(最右边的数字是   0),它可被10整除。

http://mathforum.org/library/drmath/view/55908.html

答案 1 :(得分:1)

如果您正在谈论计算方法,您可以进行5级可分性测试和2级可分性测试。
下面的数字假设无符号32位算术,但可以很容易地扩展到更大的数字。

我首先提供一些代码,然后是更多的文字解释:

unsigned int div5exact(unsigned int n)
{
    // returns n/5 as long as n actually divides 5
    // (because 'n * (INV5 * 5)' == 'n * 1' mod 2^32

    #define INV5 0xcccccccd

    return n * INV5;

}

unsigned int divides5(unsigned int n)
{
    unsigned int q = div5exact(n);
    if (q <= 0x33333333) /* q*5 < 2^32? */
    {
        /* q*5 doesn't overflow, so n == q*5 */
        return 1;
    }
    else
    {
        /* q*5 overflows, so n != q*5 */
        return 0;
    }
}

int divides2(unsigned int n)
{
    /* easy divisibility by 2 test */
    return (n & 1) == 0;
}

int divides10(unsigned int n)
{
    return divides2(n) && divides5(n);
}


/* fast one-liner: */
#define DIVIDES10(n) ( ((n) & 1) == 0 && ((n) * 0xcccccccd) <= 0x33333333 )

2的可分性很容易:(n&amp; 1)== 0 表示 n 是偶数。

可分性乘以5涉及乘以5的倒数,即0xcccccccd(因为 0xcccccccd * 5 == 0x400000001 ,如果截断为32位,则仅为0x1)。
当你将 n * 5 乘以5的倒数时,得到 n * 5 *(5的倒数),它在32位数学中简化为 n * 1

现在让我们说 n q 是32位数字, q = n *(倒数5)mod 2 32 的。
因为 n 不大于0xffffffff,我们知道 n / 5 不大于(2 32 -1)/ 5 (即0x33333333)。因此,我们知道 q 是否小于或等于(2 32 -1)/ 5 ,那么我们知道 n < / em>精确地除以5,因为 q * 5 不会被截断为32位,因此等于 n ,所以 n 除以 q 和5。

如果 q 大于(2 32 -1)/ 5 ,那么我们知道它不会分为5,因为那里是可被5整除的32位数字与0和(2 32 -1)/ 5 之间的数字之间的一对一映射,因此任何数字都是此范围不会映射到可被5整除的数字。

答案 2 :(得分:0)

这是python中的代码,用于使用按位技术检查以10为底的可分性

#taking input in string which is a binary number eg: 1010,1110
s = input()
#taking initial value of x as o
x = 0
for i in s:
    if i == '1':
        x = (x*2 + 1) % 10
    else:
        x = x*2 % 10
#if x is turn to be 0 then it is divisible by 10
if x:
print("Not divisible by 10")
else:
print("Divisible by 10")