C++ 左移小数除法

C++ 左移小数除法,c++,c++11,bit-shift,base-conversion,bitwise-and,C++,C++11,Bit Shift,Base Conversion,Bitwise And,有人向我提出了一个问题,即在不使用除法(/)和模(%)的情况下将基数从10转换为2,因此我提出了使用按位and(&)和右移(>>)运算符的解决方案 所以我开始学习这两个操作符到底做了什么,但对于一些问题,我仍然无法找到答案或理解背后的逻辑 如果我理解正确的话,除法是根据十进制和二进制的数字位值进行的。当我们将数字除以10或2时,我们将两个数字中的位值向右移动一位,这将导致十进制数除以10,二进制数除以2 X=120(以十为基数)如果X>>1,则X=12(除以10) Y=1000(以2为基数)如果

有人向我提出了一个问题,即在不使用除法(/)和模(%)的情况下将基数从10转换为2,因此我提出了使用按位and(&)和右移(>>)运算符的解决方案

所以我开始学习这两个操作符到底做了什么,但对于一些问题,我仍然无法找到答案或理解背后的逻辑

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

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 ;
}
#包括
使用名称空间std;
int main()
{
int a,b=1;

C++中的CUT< P> <代码> > /Cord>运算符总是做二进制移位,从不十进制移位。没有十进制移位操作符。如果需要的话,欢迎编写自己的函数。 尽管把10的数学除法看成是一个小数点移位的方法是正确的,但这不是C++移位的方式。它也移到右边,而不是左括号指向的那个方向。

您还误解了按位定义。当Y为位时,Y&1=Y是真的。当Y不止一位时,定义会扩展为将一位定义应用于两个操作数中的每一位。这就是按位的意思。运算符按位应用于操作数:左操作数的第一位与右操作数的第一位,以产生结果的第一位。同样,两个操作数中每个操作数的第二位决定结果的第二位,依此类推操作数中的每对位


计算两个数的余数,使用<代码> %s/Cuth>运算符,也称为模算符。在C++的教科书中阅读更多有关的内容。

< P> C++中的移位运算符总是使用基2。即,代码>×> > 1代码>用一个二进制数字移位值<代码> x <代码>。但是,请注意,这不是一个好主意。t带符号整数,因为它们的值很容易不确定:在使用位逻辑时,您总是希望使用无符号整数,例如,
无符号整数
无符号长整数
。从十进制值到内部表示的转换由输入操作完成,顺便说一句,需要检查输入操作是否成功:

if (std::cin >> a) {
     ...
}
else {
    std::cerr << "ERROR: failed to read value a\n";
}
if(std::cin>>a){
...
}
否则{
std::cerr运算符是按位运算符,在基2中“操作”


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

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

演示了转移:

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

&
操作按位操作。CPU中有32个and门,用于计算每个位位置的结果:

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打印结果时,移位称为“按位”因为它们在2位上运行,C++中的数字通常是二进制的,它们只被输入到十进制,输入和输出。< C++ >代码>包含一个值。在后台,IDE将第一个inpu十进制数更改为二进制数