- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设计一款基于多人 RTS 图 block 的游戏,其中所有游戏逻辑均由服务器处理(用 C 语言编写),并且客户端是在 Unity 中制作的,以便于跨平台部署。
我正在设计一个将通过 TCP 发送的自定义协议(protocol),我的问题是从效率的角度来看,而不是数据大小 POV(权衡),我是否最好使用按位运算符来确定用户尝试执行的操作或者我应该只使用 char(byte) 并将 int 值输入到 switch 语句中?还是我缺少另一种更有效的方法?
如果我采用按位路由,它将有 2 个字节长,本质上会被读取为一个位数组,其中 2 个字节中“1”的位置将决定将采取什么操作以及数据包的其余部分应如何进行被阅读。例如
for (int i = 0; i < sizeof(unsigned short); ++i)
{
if((pkt & 1) > 0)
{
/* call correct function for bit at index 'i' with
remaining packet data (minus these 2 header bytes) */
}
pkt >> 1;
}
或者我应该采取更清晰的读取方式(假设是字节数组或 char* :
)char val = pkt[0]
switch (val)
{
case 65:
/* call relevant function */
break;
case 66:
/* call relevant function */
break;
}
这些示例假设我已经读取了前 4 个字节中接收到的数据的大小
任何有关我应该采取哪条路线的见解都非常感谢!
最佳答案
跳转表可能是最快的:
/* declaration of action functions */
int action1(char *data);
int action2(char *data);
int action3(char *data);
int action4(char *data);
int action5(char *data);
/* Filler */
int nop(char *data) { return 0; }
/* declare jumptable action as an array of function pointers of suitable type */
int (*action[])(char*) = { action1, action2, action3, action4, action5, nop, nop, nop };
/* Call function */
char val = pkt[0] & 0x07;
result = (action[val])(pkt+2);
关于c - 哪个更快 : bitshift vs switch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827276/
如果我想对整数 5 进行位移乘以 3,所以 int a = 5; int b = a << 3; ,结果将是 40十进制为 5是101和 40是101000 . 但是,如果我有以下 char 怎么办?
我只是想学习按位/移位操作。 我遇到了下面的程序,但不理解下面程序中的 AND 条件部分(检查器 & (1 0) { return false;
我正在研究字节顺序。我的小端程序可以运行,并提供正确的输出。但是我无法绕过大端。以下是我到目前为止所拥有的。我知道我必须使用位移位,但我认为我在这方面做得不好。我试着问过我的助教和教授,但他们帮不上什
当我对最大正 2 的补码进行位移时,不应该将它位移 31 位来生成有效的 0,因为它以 0111 1111 等开头。 我试过减少类次,但我假设这只是计算机读取不正确。 int main(void) {
我想知道这个函数实际上执行了什么。据我了解,它应该返回 pSrc[1]。 那么为什么它要将 pSrc[0] 左移 8 位,这会将这 8 位清零。当这些零与 pSrc[1] 进行“或”运算时,pSrc[
我有一段代码在执行一些任务后每秒运行约 120 万次,最大的是设置一个 uint8_t 数组,其中包含来自两个 uint32_t 数据的位移数据。摘录代码如下: static inline u
http://www.fastcgi.com/devkit/doc/fcgi-spec.html在 3.4 节中: typedef struct { unsigned char na
当我在 VS 中编写此代码时,它不起作用(“无法将‘int’隐式转换为‘short’。存在显式转换。您是否缺少强制转换?”): short A = 5; short B = 1 << A; 但是这段代
我不明白您何时以及为什么要使用位移运算符进行微芯片编程:例如... SWITCH_DDR &= ~SWITCH_BIT; SWITCH_PORT |= SWITCH_BIT; 为什么要使用这些运算
在寻找将 2 个大数相乘的有效算法时,在论坛中遇到了以下 c 方法:- ... typedef unsigned long long ULL; ULL multiply (ULL a,
我需要用 bitshift 替换 Java 中的 Math.pow。 for (int i = n - 1; i >= 0; i--) Math.pow(16, n - i - 1) 其中 n
我正在设计一款基于多人 RTS 图 block 的游戏,其中所有游戏逻辑均由服务器处理(用 C 语言编写),并且客户端是在 Unity 中制作的,以便于跨平台部署。 我正在设计一个将通过 TCP 发送
我试图从函数返回两个 32 位 int 值(_mouseX 和 _mouseY),方法是先将它们打包成 64 位值,然后在我使用它们时在代码的其他地方解包它们。但是,当我通过这个函数获取数据时,数据完
var1=anyInteger var2=anyInteger (Math.round(var1/var2)*var2) 上面的 JavaScript 移位替代方案的语法是什么? 使用整数而不是 fl
在这个例子中 >>= 做了什么? byte fsr = 2; fsr >>= 2; 我在这里遇到的: https://github.com/sparkfun/MMA8452_Accelerometer
有没有人有如何使用 BitShift 的例子? Pytorch 中的运算符? 最佳答案 Bitwise shift operator performs element-wise operation.
这主要是学术性质的。只是试图理解为什么这不起作用以及如何正确地做到这一点。 我在我的数据库中存储了 0 1 或 2,其中每个代表不同的状态标志。 (这不能在生产中改变) 在我的代码中我有一个枚举 pu
我正在研究基于位板的国际象棋引擎,其中一项大量执行的操作是设置/清除无符号 64 位整数中的位。由于我不太了解哪些代码可以在某些处理器上“更快”地运行,因此我无法完全理解这一点。 设置和清除位是一个非
考虑以下代码片段: int main(){ constexpr int x = -1; if(x >= 0){ constexpr int y = 1<
我有一个问题要问你们,这已经让我抓狂了 2 天了。也许是因为我缺少位移位的基础知识,但不知何故我没有想到它。我想要的是一个简单的程序,它读取 3 个 char 或 uint8_t,将它们存储到一个大的
我是一名优秀的程序员,十分优秀!