使用C的递归函数中的按位运算
bitwise operations in recursive function using C
所以我对使用 C 还很陌生,我正在参加一个在线课程,该课程为我提供练习。
我想做的是采用 long 数据类型和 return 根据它的二进制表示形式的 int 值。规则是,如果最右边的 2 位不为零(01、10、11),则将其计为 1 并移至下 2 位,依此类推。
例如:
00000000-00000000-00000000-00000001- 应该 return 1.
00000000-00000011-00000001-00000010-应该return 3.
00001000-11000011-00001001 -00110010-应该return7.
int abcLength(long abcCode) {
if(abcCode&3) { /*** <--- Try to do this using only bitwise and logical operators ! ***/
return 0;
}
return 1 + abcLength((((unsigned)abcCode>>2)); /*** <--- Try to do this using only bitwise and logical operators ! ***/
}
问题是我不知道如何处理二进制字符串中间有 00 的情况。他们告诉我只使用一个 if 语句,但现在它应该算作 00。
关于如何使这项工作有任何想法吗?
你的代码有两个问题:
- 你 return
0
立即设置 2 个低位之一。这是不正确的。如果参数为 0,你应该 return 0
如果 2 个低位不是 0
. ,则递归值加一
- 您在递归时将
abcCode
转换为 (unsigned)
,这可能会屏蔽掉最高有效位。您应该改为 (unsigned long)
。
这是修改后的版本:
int abcLength(long abcCode) {
int n = 0;
if (abcCode == 0)
return 0;
if (abcCode & 3)
n++;
return n + abcLength((unsigned long)abcCode >> 2);
}
这可以混淆为:
int abcLength(long code) {
return code ? !!(code & 3) + abcLength((unsigned long)code >> 2) : 0;
}
这是一个带循环的解决方案:
- 合并偶数和奇数位置的位
- 迭代以计算设置了低位的字节数
简单实现:
int abcLength(long x) {
unsigned long code = x;
int n;
for (n = 0; code != 0; code >>= 2) {
if (code & 3)
n++;
}
return n;
}
这是一个没有任何循环的可能更快的方法:
int abcLength(long code) {
code = (code | (code >> 1)) & 0x5555555555555555;
code = (code + (code >> 2)) & 0x3333333333333333;
code = (code + (code >> 4)) & 0x0F0F0F0F0F0F0F0F;
return (code * 0x101010101010101) >> 56;
}
所以我对使用 C 还很陌生,我正在参加一个在线课程,该课程为我提供练习。
我想做的是采用 long 数据类型和 return 根据它的二进制表示形式的 int 值。规则是,如果最右边的 2 位不为零(01、10、11),则将其计为 1 并移至下 2 位,依此类推。 例如:
00000000-00000000-00000000-00000001- 应该 return 1.
00000000-00000011-00000001-00000010-应该return 3.
00001000-11000011-00001001 -00110010-应该return7.
int abcLength(long abcCode) {
if(abcCode&3) { /*** <--- Try to do this using only bitwise and logical operators ! ***/
return 0;
}
return 1 + abcLength((((unsigned)abcCode>>2)); /*** <--- Try to do this using only bitwise and logical operators ! ***/
}
问题是我不知道如何处理二进制字符串中间有 00 的情况。他们告诉我只使用一个 if 语句,但现在它应该算作 00。
关于如何使这项工作有任何想法吗?
你的代码有两个问题:
- 你 return
0
立即设置 2 个低位之一。这是不正确的。如果参数为 0,你应该 return0
如果 2 个低位不是0
. ,则递归值加一
- 您在递归时将
abcCode
转换为(unsigned)
,这可能会屏蔽掉最高有效位。您应该改为(unsigned long)
。
这是修改后的版本:
int abcLength(long abcCode) {
int n = 0;
if (abcCode == 0)
return 0;
if (abcCode & 3)
n++;
return n + abcLength((unsigned long)abcCode >> 2);
}
这可以混淆为:
int abcLength(long code) {
return code ? !!(code & 3) + abcLength((unsigned long)code >> 2) : 0;
}
这是一个带循环的解决方案:
- 合并偶数和奇数位置的位
- 迭代以计算设置了低位的字节数
简单实现:
int abcLength(long x) {
unsigned long code = x;
int n;
for (n = 0; code != 0; code >>= 2) {
if (code & 3)
n++;
}
return n;
}
这是一个没有任何循环的可能更快的方法:
int abcLength(long code) {
code = (code | (code >> 1)) & 0x5555555555555555;
code = (code + (code >> 2)) & 0x3333333333333333;
code = (code + (code >> 4)) & 0x0F0F0F0F0F0F0F0F;
return (code * 0x101010101010101) >> 56;
}