如何反转字节中的ON位?

pra*_*ash 5 language-agnostic

我正在读Joel的书,他在那里建议作为面试问题:

编写程序以反转给定字节中的"ON"位.

我只能想到使用C的解决方案.

在这里问,所以你可以告诉我如何以非C方式(如果可能的话)

GMa*_*ckG 21

我主张技巧问题.:)反转所有位意味着触发器,但只有明显的位意味着:

return 0;
Run Code Online (Sandbox Code Playgroud)


Jas*_*Day 14

具体问题是什么意思?

好问题.如果反转"ON"位意味着仅反转"ON"位,那么无论输入是什么,您总是会得到0.如果它意味着反转所有的位,即将所有1改为0并将所有0改为1,这就是我最初读取它的方式,那么这只是一个按位NOT或补码.基于C的语言有一个补码运算符~,就是这样做的.例如:

unsigned char b = 102;      /* 0x66, 01100110 */
unsigned char reverse = ~b; /* 0x99, 10011001 */
Run Code Online (Sandbox Code Playgroud)


ang*_*son 4

这个问题具体是什么意思?

反转是否意味着将 1 设置为 0,反之亦然?

或者它是否意味着00001100 --> 00110000你在字节中颠倒了它们的顺序?或者也许只是反转从第一个 1 到最后一个 1 的部分?IE。00110101 --> 00101011

假设这意味着反转整个字节中的位顺序,这是一个 x86 汇编器版本:

; al is input register
; bl is output register

xor bl, bl      ; clear output

; first bit
rcl al, 1       ; rotate al through carry
rcr bl, 1       ; rotate carry into bl

; duplicate above 2-line statements 7 more times for the other bits
Run Code Online (Sandbox Code Playgroud)

不是最佳解决方案,表查找更快。