|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
//整数转二进制
|
|
|
string IntToBit(int x) {
|
|
|
string s = bitset<32>(x).to_string(), s2;
|
|
|
int i = 0, len = s.length();
|
|
|
while (s[i] == '0') i++;
|
|
|
while (i <= len) s2 += s[i], i++;
|
|
|
return s2;
|
|
|
}
|
|
|
|
|
|
//二进制字符串转整数
|
|
|
int BitStrToInt(string str) {
|
|
|
string bitval5(str);
|
|
|
bitset<32> b5(bitval5);
|
|
|
return b5.to_ulong();
|
|
|
}
|
|
|
|
|
|
int main() {
|
|
|
int x = BitStrToInt("101101");
|
|
|
printf("1.去掉最后一位: 例:(101101->10110) %s\n", IntToBit((x >> 1)).c_str());
|
|
|
printf("2.在最后加一个0: 例:(101101->1011010) %s\n", IntToBit((x << 1)).c_str());
|
|
|
printf("3.在最后加一个1: 例:(101101->1011011) %s\n", IntToBit((x << 1) + 1).c_str());
|
|
|
|
|
|
x = BitStrToInt("101100");
|
|
|
printf("4.把最后一位变成1: 例:(101100->101101) %s\n", IntToBit(x | 1).c_str());
|
|
|
|
|
|
x = BitStrToInt("101101");
|
|
|
printf("5.把最后一位变成0: 例:(101101->101100) %s\n", IntToBit((x | 1) - 1).c_str());
|
|
|
printf("6.把最后一位取反: 例:(101101->101100) %s\n", IntToBit((x ^ 1)).c_str());
|
|
|
|
|
|
int k = 3;
|
|
|
x = BitStrToInt("101001");
|
|
|
printf("7.把右数第k位变成1:例:(101001->101101,k=3) %s\n", IntToBit((x | (1 << (k - 1)))).c_str());
|
|
|
|
|
|
x = BitStrToInt("101001");
|
|
|
printf("8.把右数第k位变成0:例:(101001->101001,k=3) %s\n", IntToBit((x & ~(1 << (k - 1)))).c_str());
|
|
|
|
|
|
x = BitStrToInt("101001");
|
|
|
printf("9.把右数第k位取反:例:(101001->101101,k=3) %s\n", IntToBit((x ^ (1 << (k - 1)))).c_str());
|
|
|
|
|
|
x = BitStrToInt("1101101");
|
|
|
printf("10.取末三位:例:(1101101->101) %s\n", IntToBit(x & 7).c_str());
|
|
|
|
|
|
x = BitStrToInt("1101101");
|
|
|
k = 4;
|
|
|
printf("11.取右数第k位:例:(1101101->1,k=4) %s\n", IntToBit(x >> (k - 1) & 1).c_str());
|
|
|
|
|
|
x = BitStrToInt("101001");
|
|
|
k = 4;
|
|
|
printf("12.把末k位变成1:例:(101001->101111,k=4) %s\n", IntToBit(x | ((1 << k) - 1)).c_str());
|
|
|
|
|
|
x = BitStrToInt("101001");
|
|
|
k = 4;
|
|
|
printf("13.把末k位取反:例:(101001->100110,k=4) %s\n", IntToBit(x ^ ((1 << k) - 1)).c_str());
|
|
|
|
|
|
x = BitStrToInt("100101111");
|
|
|
printf("14.把右边连续的1变成0:例:(100101111->100100000) %s\n", IntToBit(x & (x + 1)).c_str());
|
|
|
|
|
|
x = BitStrToInt("100101111");
|
|
|
printf("15.把右起第一个0变成1:例:(100101111->100111111) %s\n", IntToBit(x | (x + 1)).c_str());
|
|
|
|
|
|
x = BitStrToInt("100101111");
|
|
|
printf("16.把右边连续的0变成1:例:(11011000->11011111) %s\n", IntToBit(x | (x - 1)).c_str());
|
|
|
|
|
|
|
|
|
x = BitStrToInt("100101111");
|
|
|
printf("17.取右边连续的1:例:(100101111->1111) %s\n", IntToBit((x ^ (x + 1)) >> 1).c_str());
|
|
|
|
|
|
x = BitStrToInt("100101000");
|
|
|
printf("18.去掉右起第一个1的左边:例:(100101000->1000) %s\n", IntToBit(x & (x ^ (x - 1))).c_str());
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|