位操作 - 如何在C++中获取字符中最不重要的 3 位
bit manipulation - How to get the least significant 3 bits of a char in C++?
下面的文本是我在一段文档中坚持的内容。
数组前
char
的最低有效 3 位指示是否 它是A
或B
.如果 3 位0x2
,则数组处于A
格式。如果 3 位是0x3
的,则数组是B
格式。
这是我有生以来第一次触及这种最不重要的部分。在StackOverflow上搜索后,这就是我所做的:
int lsb = first & 3;
if (lsb == 0x02)
{
// A
}
else if (lsb == 0x03)
{
// B
}
这是对的吗?我想在继续前进之前确保这是正确的方法(并避免以后吹掉我的脚)。
x
中最不重要的 3 位是使用 x&7
获取的,与您使用的first & 3
不同。事实上,first & 3
将占用最不重要的 2 位first
。
您应该将数字转换为二进制以了解为什么会这样:二进制中的 3 是 11
,而 7 是111
。
通常,3 个最低有效位应该是 yourchar&0x07 unstead。
7因为 7 是 1+2+4 或二进制 111,对应于 3 LSB。
编辑:烤,应删除。不好意思。
您需要的变量将具有每个位零和三个LSB 1,简而言之,这是0111
。
0111
0x7
,请使用variable & 0x7
来屏蔽变量。
谷歌位屏蔽以获取有关它的更多信息。
d3 = b11 = b01 | b10
所以不,现在你只比较 2 个 LSB。 b111
会d7
如果你想写下要采取的位数,你必须把它写成
unsigned int ls3b = ~(UINT_MAX << 3);
这样做是,它采用所有 1 位数组,将其向左移动 3 位(留下 3 个 LSB 0),然后反转它。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用不带参数的函数访问结构元素
- 为什么std::valarray不是算术的
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 将静态库链接到不带-fPIC的共享库中
- 检查不带转换的扫描格式
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 为什么指针不写入类的地址?
- IpOpt拒绝解决不受约束的问题
- basic_string的前导/尾部不区分空格的特征
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- C++系统找不到指定的文件错误
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 使用 std::optional,而不是自己的结构
- C++模板 t 不是有效的模板类型
- 在不使用系统的情况下从C++应用程序格式化 Linux 中的 SD 卡
- 如何在不同的类中使用QNetworkAccessManager?类之间重要数据的常规共享