我正在读Joel的书,他在那里建议作为面试问题:
编写程序以反转给定字节中的"ON"位.
我只能想到使用C的解决方案.
在这里问,所以你可以告诉我如何以非C方式(如果可能的话)
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)
这个问题具体是什么意思?
反转是否意味着将 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)
不是最佳解决方案,表查找更快。