c++ - 在 c++ 中设置 int64 值的最高四位
问题描述
我有一个 C++ 问题。我需要修改 int64 值的四个最高位。最高位必须为“1”,接下来的三位必须为“0”。该值的其余部分不应更改。
你能帮我吗。谢谢
解决方案
要将位设置为 0,可以将位与位与位掩码一起使用:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
AND 0000111111111111111111111111111111111111111111111111111111111111
--------------------------------------------------------------------
0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
要将位设置为 1,您可以将位或与位掩码一起使用:
0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
OR 1000000000000000000000000000000000000000000000000000000000000000
-------------------------------------------------------------------
1000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
请注意,这int64
是一个有符号整数,并且是用按位和/或具有实现定义的结果修改最高有效位的结果(实际上,这意味着该值取决于负数在系统上的表示方式)。按位运算通常仅对无符号整数执行。
如果您需要对位掩码进行签名,那么自己生成位掩码非常棘手。这是因为将正数左移到不可表示的范围具有未定义的行为。最好创建一个无符号掩码,然后重新解释它。
假设您实际上想要使用 unsigned 代替:
uint64_t input = whatever;
input &= 0x0FFFFFFFFFFFFFFFu;
input |= 0x8000000000000000u;
位掩码也可以使用移位生成,这是对不同大小的整数进行泛化操作的有用方法:
using U = some_unsigned_integer;
U last_byte_offset = (sizeof(U) - 1) * 8;
U and_mask = ~(U(0xF0) << last_byte_offset);
U or_mask = U(0x80) << last_byte_offset;
推荐阅读
- html - 如何设置输入标签的文本高度?
- python - 烧瓶应用程序的测试请求没有文件
- javascript - 我该如何使用
从一个 页? - javascript - 箭头主体周围的意外块语句在 => JS React 之后立即移动返回值
- linux - 如何在 Linux 中从键中提取值
- nativescript - 相机加照片捕获的事件不起作用
- linux - 在 Jenkins 上构建的 RPM 在更新的模拟版本上失败,而不是在成功的工作站上模拟
- python - SpeechRecognition 产生 OSError: 没有可用的默认输入设备
- three.js - ThreeJS FBO 粒子光照和阴影
- php - 如何为三种类型的用户登录做 if 语句?