我试图在二进制字符串中设置位。我最初有一个空字符串,需要在字符串中设置给定位(i)。将十六进制字符输入到字符串流
对于给定的例子中,输出应该是0x3001
为:
pos: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
bit: 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
^ ^
MSB LSB
其中,在十六进制是3001
。
#include<iostream>
#include<string>
#include<sstream>
#include<iomanip>
using namespace std;
void generate_string(string& s,int i){
int sl = s.length();
int x = i/8;
std::stringstream m(s, ios_base::app);
if(sl<x){
for(int j = x-sl;j>=0;j--){
m<<'\x00';
}
}
s = m.str();
s[x] |= 1 << i%8;
}
int main(){
string s = "";
generate_string(s,15);
generate_string(s,2);
generate_string(s,3);
for(int i=0;i<s.length();i++)
cout<<hex<<(int)s[i];
return 0;
}
但是这个程序没有显示任何输出。
首先,你确实是知道比特数字实际上是相反的方式?位0是二进制数中的第一位(最低位),位15是16位二进制数中的最后位(最高位)。其次,您应该学会如何使用调试器,以便您可以自己完成代码。 –
你想让程序做什么?将位号对应的字符串设置为1? –
@JoachimPileborg我需要这样实现它。而且我知道这些位是相反的。我想你是说我需要把s [x] | = 1 << i%8;'改成's [x] | = 1 <<(7-(i%8));'' 。我试图得到[这](http://stackoverflow.com/questions/20673131/can-someone-explain-redis-setbit-command)种行为。学习使用调试器就在我的列表中。 – ayushgp