左移的十进制除法

时间:2013-08-28 21:39:17

标签: c++ c++11 bit-shift base-conversion bitwise-and

我有一个问题要将base从10转换为2 而不使用除法(/)和模块(%),所以我提出了使用按位AND(&)和右移(>>)运算符。

所以我开始了解这两个操作员究竟做了什么,但仍然有些问题我无法回答或理解背后的逻辑。

如果我理解正确除法根据数字位置值,十进制和二进制两者。当我们将数字除以10或2时,我们将位置值在两者中向右移动一位,这将导致十进制除以10,二进制除以二。

  

X = 120(以十为基数)如果X>> 1,我们将X = 12(除以10)

     

Y = 1000(以2为基数)如果Y>> 1,我们将X = 100(除以2)

但是当我使用这段代码时:

#include<iostream>
using namespace std ;

int main()
{
    int a,b=1;
    cout <<"enter an integer"<<endl;
    cin>> a;
    cout<<(a & b)<<endl;
    a=a>>1;
    cout<<a;
    cout<<endl;
    system("pause");
    return 0 ;
}

我感到困惑,因为在我看来它就像这样

  

a = 120(以十分为单位)如果X>&gt; 1,我们将得到X = 12(除以   10)

但结果是这个

  

a = 120(以十分为单位)如果X>&gt; 1我们有X = 60(除以2 !!)

我不明白结果的两个要点:

首先:如果此运算符(&gt;&gt;)只是移动代码中数字的位置值而不更改数字(10)的基数,则应该产生另一个结果(12),而不是我们在代码的结果(它是60)。为什么我们可以看到这个结果(60)而不是12?

第二:如果它是二进制左移(对我来说似乎这样),它是否首先由IDE将十进制更改为二进制?

关于按位AND,如果它是逻辑门(它似乎是):

1.除了0和1之外,我们如何设置其他值并且钢有答案?

2.按比特AND规则

  

Y'安培; 1 = Y

那么它应该是120但代码的结果是1.这是什么解释?

3.如何生成提醒(根据哪些数学运算和逻辑)?

5 个答案:

答案 0 :(得分:6)

C ++中的移位运算符总是使用基数2.也就是说,x >> 1将值x移位一个二进制数字。但请注意,移位有符号整数并不是一个好主意,因为它们的值很容易被指定:当使用位逻辑时,您总是希望使用无符号整数,例如unsigned intunsigned long 。从十进制值到内部表示的转换是由输入操作完成的,需要检查BTW是否成功:

if (std::cin >> a) {
     ...
}
else {
    std::cerr << "ERROR: failed to read value a\n";
}

另一个二进制操作( &|,_xor为^,{{1 invert )对各个位进行操作。例如,~会产生7u & 13u。要使用2的幂来得到除法的余数,只需在除法之前使用并使用合适的位掩码。

顺便说一句,如果你想更好地了解这些人如何使用二进制文件,你可能想要使用5u:这个类模板具有相同的按位运算,可以用整数构造,并且打印时显示各个位。

答案 1 :(得分:4)

C ++中的>>运算符始终执行二进制移位,从不十进制移位。没有小数移位运算符。如果你想要的话,欢迎你自己编写自己的功能。

虽然将数学除法乘以10作为一个小数位的移位并没有错,但这并不是C ++如何转移的。此外,它正在转移到,而不是 - 看看括号指向的方式。

你也误解了按位定义。 Y&amp;当Y是一个时,1 = Y,。当Y不仅仅是一位时,定义被扩展为将一位定义应用于两个操作数中的每个位。这就是按位的含义。运算符按按位应用于操作数:左操作数的第一位与右操作数的第一位组合以产生结果的第一位。同样,两个操作数中每个操作数的第二位确定结果的第二位,依此类推操作数中的每对位。

要计算除以两个数字的余数,请使用%运算符,也称为 modulo 运算符。在C ++教科书中阅读更多相关内容。

答案 2 :(得分:1)

&lt;&lt;和&gt;&gt;运算符是按位运算符,它在基数2中“运算”。

http://en.wikipedia.org/wiki/Bitwise_operation#Shifts_in_C.2C_C.2B.2B.2C_C.23

http://www.cplusplus.com/doc/tutorial/operators/

答案 3 :(得分:1)

当您通过cin >> a读取输入时,会将字符串“120”转换为整数120.在内存和CPU中,整数(可能取决于您的系统)表示为32位00000000 00000000 00000000 01111000。 如果您正在使用Windows,则可以通过方便的方式查看数字的位模式,这是程序员模式下的Windows计算器。

&操作按位操作。在CPU中有32个和门,它们计算每个位的结果:

a     = 00000000 00000000 00000000 01111000
b     = 00000000 00000000 00000000 00000001
a & b = 00000000 00000000 00000000 00000000

所以结果是整数0而不是你所写的1。

b=231的另一个例子: 结果是96,只设置位置5和6的位, 对于所有其他位置,至少一个输入位为0。

a     = 00000000 00000000 00000000 01111000
b     = 00000000 00000000 00000000 11100111
a & b = 00000000 00000000 00000000 01100000

a = a>>1之后,所有位都向右移动一个位置。 在最左边的位上发生的事情取决于符号,所以 Dietmar建议最好使用无符号数据类型 有点操纵。

a = 00000000 00000000 00000000 00111100

使用cout << a打印结果时,此位模式将转换回a 十进制表示为字符串“60”。

答案 4 :(得分:0)

使用按位移位,您使用的是二进制,而不是十进制。

在内存中,120以二进制形式存储,其中= 1111000 右移1 = 111100或60

http://www.binaryhexconverter.com/binary-to-decimal-converter

展示转变: http://www.miniwebtool.com/bitwise-calculator/bit-shift/