按位运算符从32位获取字节

Dav*_*vid 12 c c++ algorithm bit-manipulation

我有兴趣编写一个getMyByteChunkFunction接受两个参数的函数- 一个32位整数和一个字节偏移量(0,1,2或3),然后从32位整数中返回相应的字节.例如,给定此整数:

            (3)         (2)      (1)      (0)   ---byte numbers
int word = 10101010 00001001 11001010 00000101
Run Code Online (Sandbox Code Playgroud)

函数调用getMeByteChunkFunction(word, 2)返回00001001.

但是,我可以使用的按位运算符有限.我只允许使用>>,<<以及只有一个减法.我知道如何使用AND和XOR来做到这一点,但我不知道我在这里如何使用减法.有任何想法吗?

tem*_*def 25

一个想法如下.假设您有一个像这样的四字节值:

aaaaaaaa bbbbbbbb cccccccc dddddddd
Run Code Online (Sandbox Code Playgroud)

我们假设您想要从中获取该字节bbbbbbbb.如果你向右移动两个字节,你得到

???????? ???????? aaaaaaaa bbbbbbbb
Run Code Online (Sandbox Code Playgroud)

这个值等于你想要的值,除了它在顶部有???????? ???????? aaaaaaaa(因为我们不确定转换是否符号保留,因为我不知道你的值是否未签名.)无后顾之忧但是; 我们可以摆脱这些未知值和a字节.为了摆脱顶部,假设你向右移动另一个字节,给予

???????? ???????? ???????? aaaaaaaa
Run Code Online (Sandbox Code Playgroud)

现在,向左移一个字节来获取

???????? ???????? aaaaaaaa 00000000
Run Code Online (Sandbox Code Playgroud)

如果你然后做这个减法,你得到

    ???????? ???????? aaaaaaaa bbbbbbbb
-   ???????? ???????? aaaaaaaa 00000000
---------------------------------------
    00000000 00000000 00000000 bbbbbbbb
Run Code Online (Sandbox Code Playgroud)

瞧......你有你想要的价值!

我会将实际代码作为练习留给读者.别担心; 这不是特别难.:-)

  • 提名合法的StackOverflow回答最多的问号.(`???????????????? (18认同)

Tom*_*ych 6

你只需要换班就可以做到.向左移动以摆脱左侧的位,然后向右移动以摆脱右侧的位并将所需的字节移动到最不重要的位置.

  • 您是否可以先将其转为未签名?这将照顾它.如果没有,请使用templatetypedef的答案. (2认同)