要清空特定一位,则将该整数与特定所对应的掩码的按位补码(特定位为 0,其他位为 1)
进行按位与(bitwise-AND)操作。Java 中的按位与操作符是&,而按位补码操作符是~:
BIT7 本來是 1000 0000 0x80
~BIT7 反向後 11111111111111111111111101111111
作&之後可以可以去除0位置的內容
bitmap &= ~BIT7
,一次设置和清空多位:
bitmap &= ~(BITS2AND3|BIT5);
~(BITS2AND3|BIT5) 所有要關閉的位置
bitmap 要被關閉的數值
要测试一个整数的特定位是否已经被设置,可以将该整数与特定位对应的掩码进行按位与,
并将操作结果与 0 比较:
boolean bit6Set = (bitmap & (1<<6)) != 0;
開這網站的目的是發現有很多人想了解電腦相關資訊,補習費用也不便宜,下了班很累想休息一下時間無法配合於是想分享我所學 未來會包含課程規劃會有: 程式語言上:Java、C#、PHP.. 手機設計:Android,、ObjectC 認證包含:SCJP、SCWCD、LPI1~LPI2.... 網頁設計:HTML5、JavaScript.... 陸陸續續會再增加! 以上課程都是我本人教學如有任何問題可在此留言我會答覆您的
HTML/JavaScript小工具
HTML/JavaScript小工具
2014年3月27日 星期四
socket-2 基本型(int,long,short)分割成byte
因為要將基本型態轉成byte以下是自己手動轉型的方法
因為TCP 傳送是Byte形式所以~基本型態都必須分解成byte
假設我想要把int分解成byte模式作法如下
1 先算出1個整數有多少個Byte等等需要建立一個byte陣列儲存
int size = Integer.SIZE / Byte.SIZE;
int test1 = 512;
byte[] byteArray = new byte[size];
2選告一個遮罩(mask)0xff是16位元~顯示方法算成2進位
1111 1111 剛好八位元
int mask = 0xff;
3 一個迴圈將所有的整數取出,放置於一個byte陣列
for (int i = 0; i < size;i++){
byteArray[i] = (byte)(test1 >> (size - i - 1) * Byte.SIZE);
}
解釋一下:
因為要將int分解存到byte ,int 是32bit byte是 8bit所以需要4長度的陣列存
每次取8個bit進到陣列裡
下面解釋一下算法~~
512整數轉成2進位如下
1 2 3 4
00000000 00000000 00000010 00000000
我們取數字先由前面開始取所以需要將1往前移 8 * 3位置
00000000 00000000 00000010 00000000
以上來說1 位移24格後 再轉換成byte(只取8位數) 是0
以上來說2 位移16格後 再轉換成byte(只取8位數) 是0
以上來說3 位移8格後 再轉換成byte(只取8位數) 是2
以上來說4 位移0格後 再轉換成byte(只取8位數) 是0
會將這些數字存到陣列內
下面是還原
1 先宣告一個長整數(因為長整數是java整數基本型態中最大的數嘍)
long show = 0;
2 將所有儲存於byte陣列的內容取出來
for (int i = 0; i < size;i++){
show = ((show << Byte.SIZE) | (byteArray[i] & mask));
}
System.out.println(show);
解釋一下做法
一樣假設512
因為一開始都是零 所以 先將後面的bit往前推8個位置 不會變化
一開始取出來的是00000000 合併這時是
00000000
後面的bit往前推8
第二筆取出來的是00000000 合併這時是
00000000 00000000
後面的bit往前推8
第三筆取出來的是00000010 合併這時是
00000000 00000000 00000010
後面的bit往前推8
第四筆取出來的是00000000 合併這時是
00000000 00000000 00000010 00000000
每次取出來一筆就把內show的最後面8位數向前移動,並且將8bit數字整合起來
以上解釋~
有更簡單的解法
使用以下物件
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeByte(byteVal);
dos.writeShort(shortVal);
dos.writeInt(intVal);
dos.writeLong(longVal);
dos.flush();
System.out.println("Decoded message: "
+ dis.readByte() + " " + dis.readShort() + " " + dis.readInt() + " " + dis.readLong());
一樣可以將基本資料形態變成byte~~
2014年3月20日 星期四
程式當中餘數之一
int a1 = 245 % 100;
int a2 = 789 % 100;
程式當中的取餘數可用於取得尾數如上
a1 = 45
a2 = 89
另外
int a1 = 245;
int s1 = 512;
想取得這a1+s1個數的尾數可使用
(a1 + s1) % 100
或是分別
先將 a1 = a1 % 100
再將他們加總(s1 + a1) % 100
答案會是一樣的
如果想取前面的位數可使用除法如
596 想取得5 可以使用 596 / 100 可取得 5
596 / 10 可取得59
int a2 = 789 % 100;
程式當中的取餘數可用於取得尾數如上
a1 = 45
a2 = 89
另外
int a1 = 245;
int s1 = 512;
想取得這a1+s1個數的尾數可使用
(a1 + s1) % 100
或是分別
先將 a1 = a1 % 100
再將他們加總(s1 + a1) % 100
答案會是一樣的
如果想取前面的位數可使用除法如
596 想取得5 可以使用 596 / 100 可取得 5
596 / 10 可取得59
訂閱:
文章 (Atom)