我有一个问题要将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.如何生成提醒(根据哪些数学运算和逻辑)?
答案 0 :(得分:6)
C ++中的移位运算符总是使用基数2.也就是说,x >> 1
将值x
移位一个二进制数字。但请注意,移位有符号整数并不是一个好主意,因为它们的值很容易被指定:当使用位逻辑时,您总是希望使用无符号整数,例如unsigned int
或unsigned 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
答案 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/