/**java
* 功能:有个单色屏幕存储在一个一维字节数组中,使得8个连续像素能够存放在一个字节里。屏幕宽度位w,数组
* 且w能够被8整除(即一个字节不会分布在两行上),屏幕高度可由数组长度和屏幕宽度推算得出。app
* 实现方法drawHorizontalLine(byte[] screen,int width,intx1,intx2,inty),绘制从点(x1,y)函数
* 到点(x2,y)的水平线。测试
*/[java] view plain copyspa
- <pre name="code" class="java"> /**
- * 思路:使用screen[byte_pos]=0xff,一次设定一整个字节。起点和终点剩余部分的位,使用掩码设定。
- * @param screen
- * @param width
- * @param x1
- * @param x2
- * @param y
- */
- public static void drawHorizontalLine(byte[] screen,int width,int x1,int x2,int y){
- int startOffset=x1%8;
- int firstFullByte=x1/8;
- if(startOffset!=0)
- firstFullByte++;
-
- int endOffset=x2%8;
- int lastFullByte=x2/8;
- if(endOffset!=7)
- lastFullByte--;
-
- //设定完整的字节
- for(int i=firstFullByte;i<=lastFullByte;i++){
- screen[(width/8)*y+i]=(byte)0xFF;
- }
-
- //建立用于线条起点和终点的掩码
- byte startMask=(byte) (1>>startOffset);
- byte endMask=(byte) ~(1>>(endOffset+1));
-
- //设定线条的起点和终点
- if((x1/8)==(x2/8)){
- byte mask=(byte) (startMask&endMask);
- screen[(width/8)*y+(x1/8)]|=mask;
- }else{
- if(startOffset!=0){
- int byteNumber=(width/8)*y+firstFullByte-1;
- screen[byteNumber]|=startMask;
- }
- if(endOffset!=0){
- int byteNumber=(width/8)*y+lastFullByte+1;
- screen[byteNumber]|=endMask;
- }
- }
- }
扩展:.net
有一个单色屏幕储存在一维数组中,其中数组的每一个元素表明连续的8位的像素的值,请实现一个函数,将第x到第y个像素涂上颜色(像素标号从零开始),并尝试尽可能使用最快的办法。
给定表示屏幕的数组screen(数组中的每一个元素表明连续的8个像素,且从左至右的像素分别对应元素的二进制的从低到高位),以及int x,int y,意义如题意所述,保证输入数据合法。请返回涂色后的新的屏幕数组。
测试样例:
[0,0,0,0,0,0],0,47
返回:[255,255,255,255,255,255]
* \问题分析:
基本上大意就是从第x 到第y位 ,其中的像素所有变为0,如此两种状况 :0-->1, 1-->1 ,因此这时候就很清楚的用 位操做中的 ' | '
for (int i = x; i <= y;i++)
{
int k = i % 8;
int t = i / 8;
screen[t] = screen[t] | (1<<k);
}