我必須重現此測驗功能的功能,但我真的不知道從哪里開始。我最多只能使用特定的運算子和 12 個操作。
int test_dl10(int parameter1, int parameter2)
{
int result = 0;
int i;
for (i = parameter2; i <= parameter1; i )
result |= 1 << i;
return result;
}
uj5u.com熱心網友回復:
這些函式將所有位設定parameter2為parameter1。
見下面例子用于混合碼p2=2,p1=4。結果應該是二進制的 0b11100,其中設定了位 2,3 和 4。
為簡潔起見,引數名稱被縮短為p1和p2。
// use unsigned to avoid issues with overflows
unsigned result;
// set all bits from 0 to p1
result = 1u << (p1 1); // becomes 1 << (4 1) = bin 00100000
result--; // bin 00100000 - 1 = bin 00011111
// clear lower p2 bits
result = result >> p2; // bin 00011111 >> 2 = 00000111
result = result << p2; // bin 00000111 << 2 = 00011100
5 次操作完成。代碼只要0 <= p2, p1 < bits of int - 1.
編輯
測驗 32 位整數的全范圍位,其中沒有呼叫 UB(即1 << 31通常溢位 int)
#include <stdlib.h>
#include <stdio.h>
int test_dl10(int parameter1, int parameter2)
{
int result = 0;
int i;
for (i = parameter2; i <= parameter1; i )
result |= 1 << i;
return result;
}
int test_dl101(int p1, int p2)
{
// use unsigned to avoid issues with overflows
unsigned result;
// set all bits from 0 to p1-1
result = 1u << (p1 1); // becomes 1 << 5 = bin 00100000
result--; // bin 00100000 - 1 = bin 00011111
// clear lower p2 bits
result = result >> p2; // bin 00011111 >> 2 = 00000111
result = result << p2; // bin 00000111 << 2 = 00011100
return result;
}
int main(void)
{
for (int p1 = 0; p1 <= 30; p1)
for (int p2 = 0; p2 <= 30; p2)
if (test_dl10(p1,p2) != test_dl101(p1,p2)) {
printf("%d %d\n", p1,p2);
return -1;
}
puts("Passed");
}
印刷 Passed
uj5u.com熱心網友回復:
int test_dl101(int parameter1, int parameter2)
{
return (((1ULL << ((parameter1 >= parameter2) * (parameter1 - parameter2 1))) - 1) << parameter2) ;
}
假設paramter1¶meter2在范圍內<0 : sizeof(int)*CHAR_BIT-1>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335255.html
上一篇:引數中的void(*var)(void*)是什么意思?[復制]
下一篇:獲得另一個變數輸入后變數重置
