1樓:追憶
上面的zjuzzh317大佬回答的很好了,但還是想補充下....
設f(a,b) = (a+b-1)&~(b-1),f(11,6) = 16,此時16 並不能整除6,但是b為2的冪時上式是確實可行的。可以參照下面**跑一下。那麼如何證明這個結論呢,首先b如果是2的冪此時b-1應該按2進位制如下排列,這裡設a>0,b>1。
b-1 b
1 10
11 100
111 1000
1111 10000
...~將其取反則此時非0位全部為1,則&的意思很明確了,就是在高位上取一些左值對應位也為1的。設c = a+b-1,c>a,c&~(b-1)是如何保證其值是b的倍數呢,按照我們上面的分析,b在二進位制中只有一位為1,我們設這個位置是p,則b=2的p-1次方,ok,那麼~(b-1)保證了這些可取的高位一定是b的倍數,如111 1000,~111實際上是11111...
000,如果你熟悉二進位制,那麼很顯然前面那些1,我只要取一個就肯定是1000的倍數了。ok,那麼我們如何保證c&~(b-1),一定會有一個1取到呢?也很容易分析:
先寫下隱藏條件:c>a,c>b。
c>b,意味著存在比p要高或者相同的位中有一個為1。以上說明了f的值是b的倍數。那麼如何保證f的值是a的上界,且是最小的?
想想看還有哪個式子沒用到?顯然是c>a,c>a這個式子意味著什麼呢?實際上和上面哪個思想類似,因為c>a,而且c&~(b-1),這個~(b-1)左邊所有的位都是1,那麼我們把a+b-1分成兩種情況:
第一種,在第p位中有進位的情況(說明下第p位進位是什麼意思,省的產生誤會,我這裡假設進位的意思是兩個數二進位制下相加,第p位往上進1,則wo們稱第p位有進位)此時說明了什麼?
是不是在p位或者p+1...p+2..這些位上進位了?
ok,進位不就意味著c&~(b-1)>a了嗎。在第p位沒產生進位,這是什麼情況呢?實際上,b-1,中p以下的低位是不是都是1呢,如果不進位,肯定意味著a在p以下的低位根本沒有1,而此時我們用c&~(b-1)就等於a。
這樣,就證明了c&~(b-1)一定是a的弱上界,即f > a,上面我們還能得到f<=c,這裡為啥寫出來呢?下面要用到哈哈,
f<=c,實際上也很容易看出來,只需要考慮第一種情況,進位時,可能存在c中有比第p位的更低位為1,而&使得c中的這些位置為0了,其餘位自然不變,因此f<=c。
現在我們只差最後一步了,即是證明f的值一定是a的最小弱上界,這裡弱的意思就是說這個值可以是a。顯然我們只需要考慮第p位存在進位的情況,假設我們存在一個更小的下界d,d是b的倍數,且d0,使得d = f - k,這時f-k在二進位制下會發生什麼情況呢,因為f是b的倍數,所以p位以下必全0,所以k的p位以下也一定要是一個全0的情況,否則這會使得f-k不是b的倍數。但是k>0,那麼k必定要有在p位或p位以上的某些位為1,這不就說明k >= b了嗎,這裡我們就可以想到前提條件d >= a了,如果d >= a則f-k >= a,即f >= a + k,即
f >= a + b,這與f<=c矛盾了,因此並不存在一個更小弱上界了。
綜上,f(a,b)是b的倍數,且f(a,b)是a的一個最小弱上界。
這裡還遺留一個問題,也就是我們最開始說到的,b為什麼一定要是2的冪?如果不是2的冪,則b-1,無法產生p位以下全1的情況,~(b-1)也無法產生p位以上全1的情況,此時上面的證明失效。例如f(25,6) = 26。
#include
#include
void fun(int a,int b)
int main()
return 0;}
2樓:匿名使用者
先給個例子吧,假設4位十進位制數
a = 7,b = 3
(0111 + 0011) & (~0011)= (1010)&(1100) = 1000得到的結果是8
同樣的(21 + 7)&(~7)= 24
(010101 + 000111)&(111000) = (011100)&(111000) = (011000) = 24
這個邏輯式子的作用由例子可以看出一點點
8 是 4(b+1)的倍數中7的最小上界,24是8(7 + 1)的倍數中21的最小上界。
邏輯表示式的作用是求出在b + 1的倍數中a的最小上界證明過程比較複雜。。。此處略去
寫完之後發現是個非常老的問答了。。。還是發上來吧,希望對大家有幫助如果你覺得有用的話,不妨給個讚唄。
3樓:√大頭哥
按位與運算子(&)
參加運算的兩個資料,按二進位制位進行「與」運算。
運算規則
即:兩位同時為「1」,結果才為「1」,否則為0
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
按位取反運算子「~」是一個單目運算子,能對一個二進位制數的每一位都取反,即 0 變 為 1,1 變為 0。例如:
a= 0 0 0 1 1 0 1 0 /*十六進位制為 1a*/ ~ a= 1 1 1 0 0 1 0 1
/*十六進位制為 e5*/
4樓:謝登豫
a加b 和 非b 按位與。
5樓:匿名使用者
感覺原式應該是: (a+b-1)&~(b-1)。
這裡表示對a上取b的整數倍。例如 a=21, b=32, 則得到的返回值應為 32;a=33, b=32,則得到的返回值應為64。
c語言中 *b=&a什麼意思? *b和&a分別是什麼含義啊?
6樓:餡嘍嘍嘍
(a>b)?a:b
表示如果a>b為真,則取問號後邊的第一個值,這裡是a
如果a>b不為真,則取問號後邊的第二個值,這裡是b
《表示式1>?《表示式2>:《表示式3>; "?
"運算子的含義是: 先求表示式1的值, 如果為真, 則執行表示式2,並返回表示式2的結果 ; 如果表示式1的值為假, 則執行表示式3 ,並返回表示式3的結果。
若a-b非零值(即a-b邏輯值為1)則輸出a值;若a-b為零值(即a-b邏輯值為0),則輸出b值。
/ 代表的是 除法。如果 a 和 b 都是整數,不是 float 等這種浮點數,所以結果只保留整數,所以 a/b 算出來是整數。
另外,% 代表的是取餘數,即: 5%3 等於 1 餘 2,結果就是 2
c語言中(a>b)?a:b和(a
7樓:學雅思
一、表達意思不同
1、(a>b)?a:b:如果a大於b,則取a,否則取b。
2、(a
二、邏輯順序不同
1、(a>b)?a:b:記憶體邏輯中先執行大於的判斷,之後執行下一步。
三、執行順序不同
1、(a>b)?a:b:在a跟b中取最大值。
8樓:幻翼高達
c語言中,「(a>b)?a:b」和「(a」的區別是當a與b相等時,前者的值是b,後者的值的是a。
條件運算子的表示式為「表示式1?表示式2:表示式3」,先求解表示式1,若其值為真(非0)則將表示式2的值作為整個表示式的取值,否則(表示式1的值為0)將表示式3的值作為整個表示式的取值。
例如:1、max=(a>b)?a:b
就是將a和b二者中較大的一個賦給max。
2、min=(a就是將a和b二者中較小的一個賦給min。
9樓:魚與鹹魚
1、本質區別
雙引號裡面的是字串, 而單引號裡面的代表字元。
2、輸出區別
str = 「a」輸出的就是a這個字母;
str = 『a』輸出的測試65
3、底層區別
用單引號引起的一個字元實際上代表一個整數,整數值對應於該字元在編譯器採用的字符集中的序列值。
10樓:go學龍
第一個若a>b為真即執行a,為假及執行b
第二個若a
11樓:匿名使用者
這個和()沒什麼關係,我詳細的講一下,你一定要看完啊:)注意理解a++和++a的區別:
a++: 先將a的值代入表示式,在表示式運算完畢後,再將a進行++處理
++a: 先將a進行++處理,再將a的值代入表示式注意對於a++這裡有一個「在表示式運算完畢後,再將a進行++處理」,b=(a++); 這是一個賦值表示式,
所以先將a的值代入表示式,必須等到賦值表示式運算完畢後,再將a進行++處理,
也就是說必須等到給b賦值完畢後,才將a進行++處理所以b=3,a=4
12樓:匿名使用者
1.a=b>c相當於a=(b>c)是一個賦值表示式,把(b>c)的值賦給a,
(1)如果b>c為真,則把1賦值給a,
(2)如果b>c為假,則把0賦值給a。
(3)執行完該表示式,僅a的值改變,b、c的值不變。
2.a==b>c也相當於a==(b>c)是一個符合表示式,先判斷(b>c)的真假,
(1)若為真,a為1則該表示式為真,即該符合表示式的值為1。
(2)若為真,a不為1則該表示式為假,即該符合表示式的值為0。
(3)若為假,a為0則該表示式為真,即該符合表示式的值為1。
(4)若為假,a不為0則該表示式為假,即該符合表示式的值為0。
(5)執行完該表示式,a、b、c的值都不發生改變。
13樓:周肆爻
定界符不同,字元常量用的是單直撇,字串常量則用雙引號長度也不同,字元常量只能有一個字元,也就是說字元常量長度為一,而字串常量可為0,也可為任意數。即使字串常量字元數量為一,長度也不是一。
例如,字串常量"h"(這手機沒雙引號)
則長度為2,字元就是h \0
14樓:新來的文盲
a比a少一維,我具體給你解釋下。
幾個元素可以組成陣列,而幾個一維陣列可以組成二維陣列,如此一直增加維數。
比如說a[0]=2,a[1]=1,a[2]=3,組成一個一維陣列,這就是a.但是,你要注意,a不是直接把這些東西都存著的,a只存首地址。
假設定義了一個二維陣列a[3][3].這時候a[0],a[1],a[2]就不再是元素了,而代表的是一個有三個元素的一位陣列,而此時的a就是一個二維陣列。如果感覺這個有點困難沒關係,等學習了指標什麼的久很好理解這個了。
再說說你給的程式,你是不是在疑問為什麼gets()直接給str1 就可以了?還有那個輸出函式,為啥只用給str1就可以?
這得給儲存方式有關,字串就是字元的二維陣列,gets()需要輸入字串的首地址,這個還算好理解,因為你應該學過了scanf()了,二者差不多,關鍵是為什麼輸出函式直接就寫了str1呢?printf()之前你學的一般都是(printf("%d",a[1]));這種型別的。這裡為啥要填一個地址引數呢?
這是因為你前面是%s s代表字串,字串本身就是二維的,因此,你當然不能只給他一個單獨的元素了,那麼,你給了首地址他如何知道你這個字串是啥呢?因為字串都是順序儲存的,更重要的是字串在結尾處有個標誌「/0」,因此,你只要給力他首地址,他就知道從**開始,從**結束了。
純手打,望採納。
求數位電路邏輯表示式的讀法,求數位電路邏輯表示式的讀法
對於給定的電路,如果有真值表時,可以根據真值表來讀輸入輸出訊號之間的關係。舉例如下 選最簡單的 就是訊號中插入與 或 非 與非 或非 異或 同或 數位電路由真值表如何寫邏輯表示式?把真值表中輸出等於 1 的表示式相加,再化簡。真值表 a b y 0 0 0 0 1 1 1 0 1 1 1 0 y a...
寫出邏輯電路的邏輯函式表示式謝謝。這是我做的可是和答案不一樣希望電工高手幫幫我
異或門 y a b ab a b是輸入不同,輸出為 1 同或門 y a b ab a b 是輸入相同,輸出為1 同或門也叫異或非門。圖中電路 f ab c d 你說的是10.35題嗎?a b 反 c d 反 f反 反的符號無法表示,所以在後面加了一個漢字。打括號,表示是a b之後的反。其他一樣。ab...
已知邏輯函式的最小項表示式。怎麼快速的寫出對偶函式邏輯表示式
我先給結論吧 注 與提問者的提問不同,可跳轉看說明4 f m 4,6,11,12,14,15 m 0,1,2,3,5,7,8,9,10,13 f m 0,1,2,3,5,7,8,9,10,13 m 4,6,11,12,14,15 f m 2,5,6,7,8,10,12,13,14,15 m 0,1,...