1. 程式人生 > >位運算的基本習題整理

位運算的基本習題整理

  • << 左移符號,它是雙目運算子,在兩個數的中間。給出一個十進位制數11,使它左移1位。2位。 11<<1 11<<2的計算為 在這裡插入圖片描述 左移是刪除最左邊的,在最右邊補0;左移幾位,則刪除最左邊幾位,右邊補幾個0;左移是把一個數變為幾倍的方法。 6.>> 右移符號,是雙目運算子,在兩個數的中間。給出一個數11,使它右移1位,2位。 11>>1 11>>2的計算為: 在這裡插入圖片描述 右移是刪除最右邊的,在最左邊補符號位,如果有符號位就補符號位,如果沒有符號就補0,(正數補0,負數補1); 下面是一些常見的二進位制的變換操作: 1.去掉最後一位 (101101->10110) x >> 1; 右移一位,即刪掉最右邊的數,也是最後一位數,再在最左邊補符號位; 2.在最後加一個0(101101->1011010) x << 1; 左移一位,即掉最左邊的數,在最右邊加0;也是擴大的2^1倍; 3.在最後加一個1(101101->1011011) (x << 1) | 1; 因為它是在最後增加1,所以這個數先必須擴大,即先x<<1成為1011010;然後在或1;或,是隻要有1,就為1;否則為0; 1011010 0000001 結果為1011011; 4.把最後一位變為1(101100->101101) x | 1; 即 101100 000001 或1即 相同位上只要有1就為1,否則就為0; 結果為101101; 5.把最後一位變為0(101101->101100) (x | 1)-1; 先或1,即保證它最後1位為1,然後在減去1,就為0; (x|1)為101101,再減去1,為101100; 6.最後一位取反(101101->101100) x^1; 即按位異或1; 101101 000001 相同位上,只要不一樣則為1,否則為0;結果為101100; 7.把右數第k為變為1(101001->101101,k=3) x |(1<<(k-1)) 先把1左移(k-1)次即000100 然後在或x;即 101001 000100 結果為101101; 8 .把右數第k為變0(101101->101001,k=3) x&~(1<<(k-1)) 先把1左移(k-1)即000100 然後在按位取反即111011 再與x,即 101101 111011 相同位上都為1,則為1,否則為0;結果為101001; 9.右數第k為取反(101001->101101,k=3) x ^ (1 << (k-1) ); 先把1左移(k-1)即為000100; 然後在按位異或即 101001 000100 相同位上如果不一樣則為1,否則為0;結果為101101; 10.取末尾3位(1101101->101) x & 7 x與7,即 11011101 00000111 相同位上都為1,則為1,否則為0;結果為00000101;也即101; 11.取末尾k位(1101101->1101,k=4) x&((1<<k)-1) 先讓1左移4位即0010000; 然後再減一,即0001111; 然後再與x,即 1101101 0001111 相同位上都為1則為1,否則為0;結果為0001101;也即1101; 12.取右數第k位(1101101->1,k=4) ( x >> (k-1) ) & 1 先把x先右移(k-1)位,為了讓著個要取的數在最右端,即0001101 然後再與1,即 0001101 0000001 相同位上都為1,則為1,否則為0;結果為0000001;也即1; 13.把右邊連續的1變為0(100101111->100100000) (x+1) & x 先把x加1即100110000 然後再與x;即 100110000 100101111 相同位上都為1,才為1,否則為0;結果為100100000; 14.把右邊第一個0變為1(100101111->100111111) (x+1) | x; 先把x加一,即100110000 然後再或x,即 100110000 100101111 相同位上只要有一個1,就為1,否則為0;結果為100111111; 15.把右邊連續的0變為1(11011000->11011111) (x-1) | x 先把x-1,即11010111 然後再或x,即 11010111 11011111 相同位上只要有1,就為1,否則為0,結果為11011111; 以上就是整理的相關位運算的常見習題。 1.確定符號 要得到1,就要 |1,其他位都為0; 要得到0,就要&0,其他位都為1, 取反的話,要按位異或1,其他位都為0; 2.確定數字。 3.構造上一步的數字。