我得到了以下操作:C++位運算反向
uint8_t input = 10;
uint8_t output = ((0x190 - (input * 8)) & 0xFF);
// newInput should be 10 again, but is 255
uint8_t newInput = (((output * 8) + 0x190) | 0xFF);
我怎樣才能糾正操作設置newInput
,這樣會造成早在10?
我得到了以下操作:C++位運算反向
uint8_t input = 10;
uint8_t output = ((0x190 - (input * 8)) & 0xFF);
// newInput should be 10 again, but is 255
uint8_t newInput = (((output * 8) + 0x190) | 0xFF);
我怎樣才能糾正操作設置newInput
,這樣會造成早在10?
你想反轉從input
得到你output
的轉換,但不幸的是邏輯是有缺陷的。 |
不是&
和* 8
的倒數絕對不是與另一個* 8
相反。此外,如果您想要顛倒y = 0x190 - x
的行爲,那不是+
,而是另一個x = 0x190 - y
(在紙上試試!)最後,如果您的所有操作都是正確的,則操作順序需要按順序顛倒撤消它們(先入先出)。
實際上,您的轉換不能倒置,因爲它會丟失定義input
的部分信息。 (從數學上講,它不是單射。)考慮:
uint8_t input = 10;
uint8_t output = ((0x190 - (input * 8)) & 0xFF); /* 0x40 */
uint8_t input2 = 42;
uint8_t output2 = ((0x190 - (input2 * 8)) & 0xFF); /* also 0x40! */
如果你有這將撤消操作的功能,那會是什麼預期返回爲0x40
,10或42的output
?這沒有解決辦法。如果你想要原始的input
,你需要在某處保留該變量的副本。
,可以在無符號8位計算來撤消操作的例子是
y = x + a
⇔x = y - a
,y = c - x
⇔x = c - y
,包括普通否定(c
= 0),y = x^p
⇔x = y^p
,包括~x
(這是x^0xFF
),逆操作,以像y = -((x + 0x17)^0x15)
化合物會是什麼樣x = ((-y)^0x15) - 0x17
,注意,其中的步驟是撤消相反的順序。
在另一方面,這些是不可逆的:
有時候你可以找到和如果這對你來說可行的話。在這裏,如果你保證input
是0
和18
(即0x90/8
)之間,你可以嘗試
uint8_t input = 10;
uint8_t output = 0x90 - (input * 8); // spot two differences
uint8_t newInput = (0x90 - output)/8;
但如果input
較大,例如20,這反而給碰巧產生一些其它的值同樣的output
。
有幾個問題,爲什麼你的代碼將無法正常工作,讓我解釋一下其中的一些:
0x190 - (10 *8) = 0x190 - 0x50 = 0x140
可以完成,但是之後您會用&FF刪除前導1,這樣會丟失以後無法恢復的信息。| FF
是一個按位「或」,它將計算的每一位都變爲1,所以無論輸出如何,您都將獲得0xFF = 255
。我建議確保你不會溢出你的變量。使用其他常量,所以你會留在unit8_t的範圍內,或者使用另一個類型,如int16_t,它不會溢出那些小數字。 請注意您的按位運算符。就像我說的最後一個OR將始終使newInput = 255。
這裏是一個將用於給定參數的示例:
int16_t input = 10; // int16_t wont overflow
int16_t output = ((0x190 - (input * 8))); // without &FF there is no
// loss of information
int16_t newInput = (0x190- output)/8; // Reshape of the line obove
幾點這裏:
& 0xFF
截斷到8位,你應該擺脫,因爲標準已經保證這將發生無符號整數:https://stackoverflow.com/a/36234166/2642059(0x190 - output)/8U
恢復輸入,所以即使尺寸允許你的數學是錯誤的:O = 400 - 8倍速
-O - 400 = -8x
(鄰 - 400)/ -8 = X
0b1'1001'0000
如此以來,垂頭喪氣被截斷它可將最顯著位,不得進行設置,這樣你將永遠有2個可能的答案(其中output
爲正):const uint8_t newInputSmall = (0x190 - (output | 0b1'0000'0000))/8U;
cosnt uint8_t newInputLarge = (0x190 - output)/8U;
output
是負的,因爲input * 8U
大於400
'如果值== 184值= 25 ;'? –
'| (0&0x07)'什麼都不做!試了一下,得到了200的25,那麼'my_value'的類型是什麼? –
my_value是typeof uint8_t – Alex