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.它可以生成提醒(根据哪些数学运算和逻辑)?
C++中的移位运算符总是使用基数2.也就是说,x >> 1
将值移位x
一位二进制数.但请注意,移位有符号整数并不是一个好主意,因为它们的值很容易被指定:当使用位逻辑时,你总是想使用无符号整数,例如,unsigned int
或unsigned 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>
:这个类模板具有相同的按位操作,可以从整数构造,并且在打印时显示各个位.
归档时间: |
|
查看次数: |
6999 次 |
最近记录: |