左移的十进制除法

Fel*_*lix 1 c++ base-conversion bit-shift bitwise-and c++11

我已经给出了一个问题,将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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

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

但结果就是这样

a = 120(以十为基数)如果X >> 1我们有X = 60(除以2 !!)

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

第一:如果这个运算符(>>)只是移动代码中数字的位置值并且不改变数字的基数(10)它应该产生另一个结果(12),而不是我们在代码结果中看到的结果(它是60).为什么我们可以看到这个结果(60)而不是12?

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

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

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

2.按位和规则

Y'1 = Y

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

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

Die*_*ühl 6

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

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

另一个二进制操作(&用于,|,^对于_xor,和~用于反相)上的各个位进行操作.例如,7u & 13u收益率5u.要使用2的幂来获得除法的余数,您只需使用在除法之前使用合适的位掩码.

顺便说一句,如果你想更好地了解这些人如何使用二进制文件,你可能想要玩std::bitset<8>:这个类模板具有相同的按位操作,可以从整数构造,并且在打印时显示各个位.