簡體   English   中英

如何使用按位運算符返回0或1

[英]How to use bitwise operators to return a 0 or 1

我的函數接受一個32位int,如果該數字在任何偶數位置都為1,則需要返回0或1。 我不能使用任何條件語句,一次也只能訪問8位。

這是一個示例輸入:10001000 01011101 00000000 11001110

1)用AA(10101010)移位位和它們,並將每個位存儲在變量中。

int a = 10001000
int b = 1000
int c = 0
int d = 10001010

現在,如果沒有設置奇數位,則需要返回0,如果有,則需要返回1。 正如我們所看到的。 所以我需要將它們組合成一個數字,然后使用!! 運算符返回0或1。這是我遇到問題的地方。

int valueToReturn = a | b | c | d;

現在我要說:

return !!valueTOReturn; 

這不是回報正確的價值,任何人都可以給我任何見識嗎???

我不能使用||之類的任何條件語句 &&

我想到了。 我說的一切都給出了正確的答案,但是我為我的一個變量獲取了錯誤的值。 感謝您的所有幫助!

但是,我不知道我是否理解正確,如果a具有32位數字,則只有在為0時才可以將ALL位全部關閉。

if(input_number == 0 )
return 0;
else 
return 1;

如果您不能使用條件語句,則必須以丑陋的方式進行:獲取每個偶數索引位的位並返回它們的OR。 您可以跳過面具。 不過,這是一種愚蠢的做法,而且功課不好。

編輯我的答案以刪除錯誤的第一部分。

看來arnaud576875關於邏輯是正確的! 運算符: http : //www.gnu.org/s/gnu-c-manual/gnu-c-manual.html#The-Logical-Negation-Operator

直到有人找到C99規范參考(GNU實現可能會偏離它)之前,我想我不確定,但是我懷疑您的C版本是否如我先前所述。

首先,您沒有按照自己的想法存儲位。

int a = 10001000

實際上是10,001,000(二進制,b100110001001101001101000)。

您說該函數采用32位整數,因此您可以執行的操作是提取每個8位部分,如下所示:

unsigned char a, b, c, d;
a = (unsigned char)(input & 0xff);
b = (unsigned char)((input >> 8) & 0xff);
c = (unsigned char)((input >> 16) & 0xff);
d = (unsigned char)((input >> 24) & 0xff);

現在,您可以執行屏蔽/測試操作:

return (0xAA & a) | (0xAA & b) | (0xAA & c) | (0xAA & d);

正如bdares所說,這只是很多按位運算... evenbit_int計算evenbit_int請求值。

#define evenbit_byte(x) (((x) >> 1 | (x) >> 3 | (x) >> 5 | (x) >> 7) & 1)
#define evenbit_int(x) (evenbit_byte(x) | evenbit_byte(x >> 8) | evenbit_byte(x >> 16) | evenbit_byte(x >> 24))

或更優化

byte evenbits(DWORD x)
{ 
  byte a = x >> 8;    
  byte b = x >> 16;    
  byte c = x >> 24;
  return (evenbit_byte(x) | evenbit_byte(a) | evenbit_byte(b) | evenbit_byte(c))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM