我被要求在不使用除法(/)和模数(%)的情况下将基数从 10 转换为 2 ,因此我想出了使用按位与(&)和右移(>>)运算符的解决方案。
因此,我开始了解这两个运算符的确切作用,但对于某些问题,我仍然无法找到答案或理解其背后的逻辑。
如果我理解正确除法是根据数字位值,十进制和二进制。当我们将数字除以 10 或 2 时,我们将位值向右移动一位,这将导致十进制除以 10,二进制除以 2。
X=120(以十为底)如果 X>>1 我们将有 X=12(除以 10)
Y=1000(以二为底)如果 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>>1 我们将有 X=12(除以 10)
但结果是这样的
a=120(以十为底)如果 X>>1 我们有 X=60(除以 2 !!)
我不明白关于结果的两个要点:
首先,如果这个操作符(>>)只是移动代码中数字的位置值而不改变数字(10)的基数,它应该产生另一个结果(12),而不是我们在代码结果中看到的(它是 60)。为什么我们可以看到这个结果(60)而不是 12?
其次,如果它进行二进制左移(对我来说似乎是这样),它是否首先通过 IDE 将十进制更改为二进制?
关于按位与,如果它是逻辑门(看起来是这样):
1.我们怎样才能把除了0和1之外的其他值,仍然有答案?
2.根据位与规则
Y&1=Y
那么它应该是 120 但代码的结果是 1。对此有何解释?
3.如何产生余数(根据哪些数学运算和逻辑)?