小数除以左移

Decimal Division by left shift

本文关键字:左移 小数      更新时间:2023-10-16

有人问我如何在不使用除法(/)和模(%)的情况下将基数从10转换为2,所以我想出了使用位and(&)和右移(>>)运算符的解决方案。

所以我开始了解这两个运算符的确切作用,但对于一些问题,我仍然找不到答案,也不理解背后的逻辑。

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

如果X>gt;1我们将有X=12(除以10)

如果Y>gt;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 ;
}

我感到很舒服,因为在我的脑海里它就像这个

如果X>gt;1我们将得到X=12(除以10)

但结果是这个

如果X>gt;1我们有X=60(除以2!!)

我不理解关于结果的两个要点:

首先,如果这个运算符(>>)只是移动代码中数字的位置值,而不改变数字(10)的基数,那么它应该会产生另一个结果(12),而不是我们在代码结果中看到的结果(它是60)。为什么我们能看到这个结果(60)而不能看到12?

第二,如果它做二进制左移(对我来说似乎是这样),它会不会在IDE中将十进制改为二进制?

关于按位And,如果它是逻辑门(看起来是):

1.我们怎么能把0和1以外的其他值都放进去,却仍然有答案?

2.根据位与规则

Y&1=Y

那么它应该是120,但是代码的结果是1。对此有何解释?

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

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

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

其他二进制运算(&用于|用于<或>^用于_xor,~用于inverse)对各个位进行运算。例如,7u & 13u产生5u。要获得2次方除法的余数,只需在除法之前使用,并使用合适的位掩码。

顺便说一句,如果你想更好地了解这些家伙是如何在二进制中工作的,你可能想玩std::bitset<8>:这个类模板有相同的逐位操作,可以从整数构建,打印时显示单个位。

C++中的>>运算符总是执行二进制移位,而从不执行十进制移动。没有十进制移位运算符。如果你想要的话,欢迎你编写自己的函数。

虽然把数学除以10看作是小数点后一位的移位并没有错,但C++并不是这样移位的。此外,它正在向右侧移动,而不是向左侧——看看括号指向的方向。

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

要计算两个数的余数,请使用%运算符,也称为运算符。在你的C++教材中阅读更多关于它的内容。

<和>>运算符是按位运算符,它们在基数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/

当您读取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

在CCD_ 18之后,所有比特被向右移动一个位置。最左边的比特会发生什么取决于符号,因此Dietmar建议最好使用未签名的数据类型位操作。

a = 00000000 00000000 00000000 00111100

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

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

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

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

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