【发布时间】:2017-05-07 17:04:45
【问题描述】:
假设你有一个整数a = 0x12345678 和一个短的b = 0xabcd
我想做的是将integer a 中的给定半字节替换为来自short b 的半字节
例如: 用半字节替换 a = 0x12345678 中的第 0、2、5、7 个半字节(其中 8 = 第 0 个半字节,7 = 第 1 个半字节,6 = 第 2 个半字节,依此类推...)来自b = 0xabcd(其中 d = 第 0 个半字节,c=第 1 个半字节,b=第 2 个半字节,依此类推...)
我的方法是-
- 从
a中清除我们要替换的位。 喜欢a = 0x02045070 - 从短
b创建掩码,如mask = 0xa0b00c0d - 按位
OR他们得到结果。result = a| mask即result = 0xa2b45c7d因此替换了半字节。
我的问题是我不知道有任何有效方法可以根据给定的short b 创建所需的掩码(如步骤 2)
如果您能给我一个高效的方法,那对我来说将是一个很大的帮助,我提前感谢您;)
如果需要更多信息,请询问。
编辑:
我解决问题的代码(虽然不够好)
非常感谢任何改进。
int index[4] = {0,1,5,7}; // Given nibbles to be replaced in integer
int s = 0x01024300; // integer mask i.e. cleared nibbles
int r = 0x0000abcd; // short (converted to int )
r = ((r & 0x0000000f) << 4*(index[0]-0)) |
((r & 0x000000f0) << 4*(index[1]-1)) |
((r & 0x00000f00) << 4*(index[2]-2)) |
((r & 0x0000f000) << 4*(index[3]-3));
s = s|r;
【问题讨论】:
-
结果 = ( a & ffff0000 ) | b
-
@VikashKumarVerma 请参阅示例,我想替换 给定的小食,您的解决方案将始终替换前 4 个小食。
-
"给我一个有效的方法" --> 在你的平台上,使用乘法是否有效?
-
嗯,我认为一个有效的答案是
result = (a & a_mask) | ((b*TBD) & b_mask);嗯 - 会思考。 -
另外:“nibbles list”的格式是什么?它是
ints 的数组吗?可以短于4吗?在编译时就知道了吗?
标签: c bit-manipulation bitwise-operators bit-shift bitmask