- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我刚开始使用位。我正在尝试使用现有协议(protocol),它可以发送三种不同类型的消息。
类型 1 是 16 位结构:
struct digital
{
unsigned int type:2;
unsigned int highlow:1;
unsigned int sig1:5;
unsigned int :1;
unsigned int sig2:7;
};
前两位(类型,在我上面的结构中)总是 1 0 。第三位highlow决定信号是开还是关,和sig1+sig2一起定义了信号的12位索引。这个索引被一个 0 分割成两个字节,它总是在第 7 位。
类型 2 是 32 位结构。它有一个 2 位类型、一个 10 位索引和一个 16 位值,在位置 27、23、15 和 7 处散布着 0。位域结构表示如下所示:
struct analog
{
unsigned int type:2;
unsigned int val1:2;
unsigned int :1;
unsigned int sig1:3;
unsigned int :1;
unsigned int sig2:7;
unsigned int :1;
unsigned int val2:7;
unsigned int :1;
unsigned int val3:7;
};
sig1 和 sig2 一起构成 10 位索引。 val1 + val2 + val3 共同构成信号在10位索引处的16位值。
如果我了解如何使用前两个结构,我想我可以弄清楚第三个。
我的问题是,有没有办法分配一个值并让程序计算出需要进入 val1、val2 和 val3 的位?
我读过有关位移位、位域结构和用 0 填充的内容。该结构似乎是要走的路,但我不确定如何实现它。我见过的所有位打包示例都没有按这些方式拆分的值。最终,我希望能够创建一个模拟结构,分配一个索引 (i = 252) 和一个值 (v = 32768) 并完成它。
如果有人可以建议适当的方法或提供类似示例的链接,我将不胜感激。如果重要的话,这段代码将被合并到一个更大的 Objective-C 应用程序中。
谢谢。
布拉德
最佳答案
你可以用一系列的转变,and
s,和or
s来做到这一点。我已经完成了类型 2 的 10 位索引部分:
unsigned int i = 252;
analog a = (analog)(((i << 16) & 0x7f0000) | (i << 17) & 0x7000000);
本质上,这段代码所做的是将 int i
中感兴趣的 10 位移动到 16 - 25 的范围内,然后 and
使用位掩码 对其进行处理>0x7f0000
将位 22 - 31 设置为零。它还将 10 位的另一个副本移动到范围 17 - 26,然后它并
使用位掩码 0x7000000
将其设置为 0 - 22 位和 26 - 31 位零。然后它或
将这两个值组合在一起以创建您想要的零分隔值。
.. 我不确定我是否正确地计算了位掩码,但我希望你已经明白了。只需移动、屏蔽和或合并。
编辑: 方法二:
analog a;
a.sig1 = (i & 0x7f); // mask out bit 8 onwards
a.sig2 = ((i<<1) & 0x700); // shift left by one, then mask out bits 0-8
再三考虑,方法 2 更具可读性,因此您可能应该使用它。
关于c - 位移位、掩码还是位域结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1797345/
我想将这个无符号数:1479636484000 向右移动 7 位。这在 JavaScript 中可能吗? 两者 1479636484000 >> 7 和 1479636484000 >>> 7 返回错
鉴于以下代码: import matplotlib.pyplot as plt import numpy as np x = [1.0, 1.1, 2.0, 5.7] y = np.arange(le
我有一个低级键盘钩子(Hook),目前允许我从任何应用程序(包括游戏)中控制媒体播放器。 它通过查看捕获的特定击键来工作。 我想扩展它以查找键的组合。我可以对一些逻辑进行硬编码,但我觉得必须有一种更合
我需要一些帮助来理解这段C代码。我不知道这里的“L”和“\”是什么?请也说明一点:) #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>2
我正在查看一段代码: int result = 0 ; char byte = foo[j] for (i = 7 ; i>0 ; i--) { byte = (byte & ~0x1)>>1
我们有一个项目要求我们编写一个程序,允许用户输入一系列数字“将数字读入数组以进行进一步处理,用户通过输入负数表示他们已完成(负数不用于计算),在读取所有数字后执行以下操作,总结输入的#,计算输入的#,
锁定。有disputes about this question’s content正在解决中。它目前不接受新的答案或互动。 def menu(): choice = input("Pres
为什么如果 int x = -1 // binary: 11111111111111111111111111111111 x = x >>> 31; 我们有 000000000000000000000
我的问题其实应该很简单:我有一个玩家对象数组。(玩家[])我想要一个函数来旋转这个数组直到一个索引: public void rotateArray(Object[] array, int index
我有一个编码为 boost 动态位集的数字列表。我根据此列表中的任何数字可以采用的最大值动态选择此位集的大小。所以假设我有从 0 到 7 的数字,我只需要三位,我的字符串 0,2,7 将被编码为000
我能想到一些令人讨厌的低效方法来完成这项任务,但我想知道最好的方法是什么。 例如,我想复制一个字节中从第 3 位开始的 10 个字节,并像往常一样复制到一个指针。 有没有比一次复制一个移位字节更好的方
我正在尝试为该问题添加更多规则,并且该规则一直给我带来这种转变/减少冲突的能力,我不知道为什么会这样做,并且在过去的24小时内我一直在尝试解决问题 FuncDecl : RetTyp
This question already has answers here: Why does it make a difference if left and right shift are us
我在 Perl 中遇到这个问题已经有几天了,在搜索了无数的手册页、perldocs 和谷歌搜索了太多的搜索词之后,希望这里有人能帮助我。 我得到两个表示十六进制值的字符串,即“FFFF”,而不是 Pe
我有一个主 div,两个 div 水平并排放置在这个父 div 中。 .parent{ height: 360px; margin-top: 0px; bo
我想 float 我的元素列表并从第二个元素创建一个移动效果。 如何避免第二个 .item 之后的“清除”行为? .shift { float: right; width: 50%;
我正在使用 SSE3 优化我的代码。代码中有一点迫使我将 vector 中的所有元素移动一个元素 v[0] = 0 //v is some char* and N = v.size() for(i
.file "calcnew.c" .text .globl calcnew .type calcnew, @function calcnew:
我有一个点对象: class Point { final int x,y; ... } 因为这些点将在我的代码中到处使用/创建,所以我想开始使用 guavas 缓存。不幸的是
x = "Foo 890 bar *()" 如何将包括 "*()" 在内的小写字母“未移位”返回到 890?期望的结果: foo 890 bar 890 不需要的: x.lower() => "foo
我是一名优秀的程序员,十分优秀!