- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将来自设备的输入(始终为 1 到 600000 之间的整数)转换为四个 8 位整数。
例如,
如果输入是32700,我要188 127 00 00
.
我通过使用实现了这一点:
32700 % 256
32700 / 256
以上工作到 32700。从 32800 开始,我开始得到不正确的转换。
最佳答案
主要编辑以下澄清:
鉴于有人已经提到了 shift-and-mask 方法(不可否认,这是正确的方法),我将给出另一种方法,迂腐,不可移植,依赖于机器,并且可能表现出未定义的行为。尽管如此,IMO 还是一个很好的学习练习。
由于各种原因,您的计算机将整数表示为一组 8 位值(称为字节);请注意,虽然非常普遍,但情况并非总是如此(请参阅 CHAR_BIT
)。出于这个原因,使用多于 8 位表示的值使用多个字节(因此使用多个位的值是 8 的倍数)。对于 32 位值,您使用 4 个字节,并且在内存中,这些字节始终紧随其后。
我们称指针为包含另一个值在内存中的地址的值。在这种情况下,字节被定义为指针可以引用的最小(就位计数而言)值。例如,您的 32 位值,覆盖 4 个字节,将有 4 个“可寻址”单元(每个字节一个),其地址定义为这些地址中的第一个:
|==================|
| MEMORY | ADDRESS |
|========|=========|
| ... | x-1 | <== Pointer to byte before
|--------|---------|
| BYTE 0 | x | <== Pointer to first byte (also pointer to 32-bit value)
|--------|---------|
| BYTE 1 | x+1 | <== Pointer to second byte
|--------|---------|
| BYTE 2 | x+2 | <== Pointer to third byte
|--------|---------|
| BYTE 3 | x+3 | <== Pointer to fourth byte
|--------|---------|
| ... | x+4 | <== Pointer to byte after
|===================
因此,您想要做的(将 32 位字拆分为 8 位字)已经由您的计算机完成,因为它是由其处理器和/或内存架构强加给它的。为了获得这种几乎巧合的好处,我们将找到您的 32 位值的存储位置并逐字节读取其内存(而不是一次 32 位)。
Any number of derived types can be constructed from the object and function types, as follows:
- An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. [...] Array types are characterized by their element type and by the number of elements in the array. [...]
- [...]
int32_t value;
它的地址由
&value
给出.同时,一个 4 个 8 位字节的数组可以表示为:
uint8_t arr[4];
请注意,我使用了 unsigned 变体,因为这些字节本身并不真正代表一个数字,因此将它们解释为“有符号”是没有意义的。现在,一个指向 4 数组的指针-
uint8_t
定义为:
uint8_t (*ptr)[4];
如果我将 32 位值的地址分配给这样的数组,我将能够单独索引每个字节,这意味着我将直接读取字节,避免任何讨厌的移位和屏蔽操作!
uint8_t (*bytes)[4] = (void *) &value;
我需要转换指针(“
(void *)
”),因为我无法忍受那个提示的编译器
&value
的类型是“pointer-to-
int32_t
”,而我将它分配给“pointer-to-array-of-4-
uint8_t
”,并且这种类型不匹配被编译器捕获并迂腐警告按标准;这是第一个警告,我们正在做的事情并不理想!
(*bytes)[n]
阅读
n
value
的第 - 个字节!
send_can(uint8_t)
功能:
for (size_t i = 0; i < sizeof(*bytes); i++)
send_can((*bytes)[i]);
并且,为了测试目的,我们定义:
void send_can(uint8_t b)
{
printf("%hhu\n", b);
}
在我的机器上打印
value
是
32700
:
188
127
0
0
最后,这显示了该方法依赖于平台的另一个原因:存储 32 位字的字节的顺序并不总是您从二进制表示的理论讨论中所期望的,即:
n
-th“逻辑”字节。
关于将 32 位数字转换为四个 8 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62607049/
假设我得到了两个整数 a, b 其中 a 是一个正整数并且小于 b 。我必须找到一种有效的算法,它会在 [a, b] 区间内给出 base2 位数(位数)的总和。例如,在区间 [0, 4] 中,数字之
到目前为止我已经尝试过不同的 autofilter但非选项似乎对我有用,我有许可证号列,其中应该只有 10 位数字,并且 autofilter我正在尝试查找少于或多于 10 位数字的条目, 我将该列转
谁能告诉我检查输入的数字是否为 3 位数字的正则表达式...它也不应该允许字母.... 最佳答案 3 个数字的正则表达式为 ^[0-9]{3}$ 或 ^\d{3}$ 关于javascript - 是否
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
我正在运行一个我创建的java程序,它存储用户输入的数据。具体来说,有 4 个数组列表,分别是songName、songArtist、songYear 和songAlbum。我有一个“songYear
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
给定一个 float ,我想使用半偶数舍入将结果四舍五入到小数点后四位,即四舍五入到下一个偶数的方法。例如,当我有以下代码片段时: #include #include int main(){
有没有一种方法可以在不使用小程序的情况下确定客户端计算机上的 jvm 位数?我确实看到了这个link但这决定了 jvm 版本而不是位数。提前致谢 最佳答案 您可以尝试确定浏览器位数 - 32 位 ja
我正在编写一个程序来计算给定数字的两个二进制表示之间的共同位数。我写的代码是: int common_bits(int a, int b) { static long binaryNo1,binary
如何使表格中的每个单元格的最小宽度为 3 位数字并且不会更大?现在我正在对 min-width 进行硬编码,但我不喜欢对值进行硬编码,因为将来我可能想更改字体。如果需要 Javascript 也没关系
我正在尝试匹配后跟一个空格或制表符和 5 个数字的单词。例如 some noise text off 12345 some noise text again. 另一个例子是: Some noise t
我在从 double 到 string 的转换时遇到问题。 我要转换: double value: 0.0772486324655191 string value: 0.077248632465519
我正在尝试实现一个使用 128 位 key 的密码。 key 计划的一部分是将 key 向右旋转 29 位,但我不确定该怎么做,因为 Java 中没有单一数据类型可以保存整个 key 。我将它存储在两
我正在尝试在 AVX2 中对 128 位数进行左旋转。由于没有直接的方法,我尝试使用左移和右移来完成我的任务。 这是我执行相同操作的代码片段。 l = 4; r = 4
我有一个 int,它的值类似于 1235 和 12890。我只想要这个 int 的前 2 位数字。我怎样才能提取它? 想了半天,想不出什么办法。 最佳答案 减少数字,直到只剩下两位数: while (
TL:DR 我想要紧跟“+”符号的任何行上的前两个数字的语法。 给定以下文本(来自熟悉的实用程序): power_meter-acpi-0 Adapter: ACPI interface power1
因此根据 cplusplus.com,当您通过以下方式将输出流的格式标志设置为科学记数法时 of.setf(ios::scientific) 您应该在指数中看到 3 位加号和一个符号。但是,我的输出似
这个问题在这里已经有了答案: How can I pad a value with leading zeros? (77 个答案) 关闭 9 年前。 如果小时数小于 10 小时,则小时数通常以个位数
我正在使用 moment.js使用根据距离/速度计算的日期时间。我也在使用 moment duration format plugin .当我将值传递给 moment.duration 然后对其进行格
我正在将一个应用程序从 .NET 移植到 Mono 运行时,并且在代码中的某个位置我可以看到一个 float 具有值 158136.422。我对 float 的理解是它是 7 位精度,那么这个数字如何
我是一名优秀的程序员,十分优秀!