1. 取出数中任意k位置的二进制位是0还是1
n >> k & 1 原理:先把想要取出的位置移动到个位,1的二进制是 0001 , 进行与操作就可以提取出最后一位是0还是1;二进制是从右向左,由低到高,从0到7。
2. 右移操作 等于 n / 2^k , 左移操作 == n * 2 ^ k
3.取一个字节任意区间的十进制数,设置(辅助字节)全部位设置为0,根据想要获取的目标字节的区间,设置(辅助字节二进制位)中的对应区间部分,全部换成1,然后转为16进制。做&操作,按位与的结果就是目标自己区间的十进制表示形式。例如 0x67 & 0x1f = 7 ,01100111 & 00011111 (从0x67中取出该字节0-4后五位十进制表示)【注意:二进制的左边是高位,右边是低位,所以需要进行右移操作将需要获取的部分与最低位重合】例如0x80二进制位1000 0000 取出10的十进制操作为0x80 & 0xC0 >> 6,对于0x67取后五位的情况不需要进行结果右移操作,其他情况均需要视情况进行右移
#include <iostream>
#include <bitset>
using namespace std;
int main() {
unsigned char originalByte = 0x67;
unsigned char mask = 0;
mask |= (1 << 0);
mask |= (1 << 1);
mask |= (1 << 2);
mask |= (1 << 3);
mask |= (1 << 4);
unsigned char result = originalByte & mask;
cout << "Original Byte: 0x" << hex << (int)originalByte << endl;
cout << "Mask: 0x" << hex << (int)mask << endl;
cout << "Result: 0x" << hex << (int)result << endl;
return 0;
}
4.两个字节合并成一个16位short类型
unsigned short func = 0;
func = func | data[7];
func = func << 8;
func = func | data[8];
5.lowbit
作用:取出二进制最后的1,例如整数2的二进制位是0010那么会取出10的部分。
应用:统计有多少个1。
思路:使用给定整数减去其中的最后一位1。
#include <iostream>
using namespace std;
int lowbit(int x)
{
return x & -x;
}
int main()
{
int x;
cin >> x;
int res = 0;
while (x) x -= lowbit(x), res++;
cout << res << endl;
return 0;
}
6.判断一个int变量是正还是负
#include <iostream>
using namespace std;
int main()
{
int num = -10;
// 判断正负值
if (num & (1 << 31)) {
std::cout << "正数" << std::endl;
}
else {
std::cout << "负数或者为零" << std::endl;
}
return 0;
}