我现在知道它是如何在一行中完成的,尽管我没有意识到为什么我的初稿也不起作用。我要做的是将下半部分保存到另一个变量中,将高位字节向右移动并通过OR添加两个数字。但是,它只是切割十六进制的下半部分并返回其余部分。
short int method(short int number) {
short int a = 0;
for (int x = 8; x < 16; x++){
if ((number & (1 << x)) == 1){
a = a | (1<<x);
}
}
number = number >> 8;
short int solution = number | a;
return solution;
答案 0 :(得分:8)
你一次只做一点;更好的方法是通过一次操作来实现:
uint16_t method(uint16_t number) {
return (number << 8) | (number >> 8);
}
上面的代码明确指定了16位无符号类型,从而避免了与符号扩展相关的问题。您需要在{C ++中包含<stdint.h>
(或<cstdint>
)才能进行编译。
答案 1 :(得分:4)
if ((number & (1 << x)) == 1)
如果x
为0,则仅返回true。因为二进制中的1是00000000 00000001
,而1 << x
将除了第x位之外的所有位都设置为0。
你不在乎它是否为1,你只关心它是否为非零。使用
if (number & (1 << x))