优化和逆转字节nibbles的方法 我目前正在研究加密,我想出了逆转字节的nibbles的方法(ex。0xf5=> 0x5f)。我想到了这个解决方案: 字节>> 4 | (字节&0x0f)

问题描述 投票:0回答:1
)。我想到了这个解决方案:

byte >> 4 | (byte & 0x0F) << 4
我在网上发现的其他解决方案是相似的,但是通过掩盖字节的左鼻子来增加一个额外的操作数:
(byte & 0xF0) >> 4 | (byte & 0x0F) << 4

在二进制中,第二个解决方案看起来像这样:

# Extract the right nibble of a byte and shift to the left [0xF5] 1111 0101 # Original Value [0x0F] 0000 1111 & # Mask Right Nibble [0x05] 0000 0101 = # Extracted Right Nibble [0x50] 1010 0000 << 4 # Shift Four Bits to the Left # Extract the left nibble of a byte and shift to the right [0xF5] 1111 0101 # Original Value [0xF0] 1111 0000 & # Mask Left Nibble [0xF0] 1111 0000 = # Extracted Left Nibble [0x0F] 0000 1111 >> 4 # Shift Four Bits to the Right # Combine the shifted nibbles together [0x05] 0000 1111 # Left Nibble Shifted to the Right [0xF0] 0101 0000 | # Right Nibble Shifted to the Left [0xF5] 0101 1111 = # New Value

如果我错了,请纠正我,但是第二个解决方案如果您处理大于一个字节并且仅专注于最小字节的数据类型,则很有用。因此,如果您不掩饰而移动,则来自较高阶的字节的位会传播到左侧的nibble中。因此,在这种情况下,掩盖左边的nibble是必要的。
# Bits shift into the least significant byte without masking
[0x0AF5] 0000 1010 1111 0101
[0x00AF] 0000 0000 1010 1111 >> 4
另一方面,如果您真正与一个字节一起工作,则不会掩盖左鼻子冗余,因为左nibble位会在右移动四个位后被归零吗?

[0xF5] 1111 0101 [0x0F] 0000 1111 >> 4

也许还有其他原因可以掩盖我不知道的左边刺。例如,在需要第二个解决方案的情况下,其他系统的行为可能会有所不同。
我在正确的位置有我的头,还是我应该考虑的东西?
这里是进一步澄清的示例代码:

typedef uint8_t byte; static inline byte swap_nibbles(byte bits) { return bits >> 4 | (bits & 0x0F) << 4; }
    

您不显示
byte
的定义。如果它具有签名的八位整数,则此代码:

signed char byte = -111; /* 0x91 */ printf("0x%hhX\n", byte); byte = byte >> 4 | (byte & 0x0F) << 4; printf("0x%hhX\n", byte);

Prints:

0x91 0xf9
尽管最初包含位91
16
c bit-manipulation bit-shift bitmask nibble
1个回答
0
投票
byte

中,它被提升为

byte >> 4
。由于这些位代表值-111的值,因此以该值产生一个值,即具有四字节

int
,ffffff91
16

。然后

int
产生ffffff9
16

。用10

16
int产生FFFFFF9
16
,然后将其分配给
>> 4
将其转换为
|
。这是实现定义的,但最常见的结果是包裹模量256,产生位f9
16
,代表值-7.在对比中,使用
byte
印刷: 0x91 0x19 ,如果
signed char
有未签名的八位整数类型,那么对byte = (byte &0xF0) >> 4 | (byte & 0x0F) << 4;的促销不是问题,因为
byte
有足够的净空,可以在这些表达式中保存这些值而不会遇到符号或溢出问题。
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.