[comp.lang.fortran] FORTRAN-77 XLA PLUS BITWISE OPERATORS

cjn@homxb.UUCP (04/10/87)

------------------------------------------------
Penn State Univ. has two 3b-15 computers with FORTRAN-77 XLA PLUS.
They would like to write fortran programs capable of bitwise operations,
but are unusre how to go about it.  Since I have little knowledge of
FORTRAN-77, I post the following queries to the net:

	- how do you write a bitwise AND 
	- how about bitwise OR

	- can you reference modules written in C from a fortran
	  subroutine.  If so, how do you go about it.

	Please send email to homxb!cjn

	Thanks in advance.

				- charlie northrup
				  bell labs
				  hr-1h332

jerraya@imag.UUCP (04/19/87)

in article <214@homxb.UUCP>, cjn@homxb.UUCP says:
> Posted: Fri Apr 10 15:15:14 1987
> 
> ------------------------------------------------
> Penn State Univ. has two 3b-15 computers with FORTRAN-77 XLA PLUS.
> They would like to write fortran programs capable of bitwise operations,
> but are unusre how to go about it.  Since I have little knowledge of
> FORTRAN-77, I post the following queries to the net:
> 
> 	- how do you write a bitwise AND 
> 	- how about bitwise OR
> 
 You can use the equivalence construction to achieve this. 
 As example, I give a fortran function that compute an AND bitwise
 operation:

integer function AND(i1,i2)
integer k1, k2,k3
logical j1,j2,j3
equivalence (k1,j1), (k2,j2), (k3,j3)

k1=i1
k2=i2
j3=j1.and.j2
AND=k3
end		    

If you substitute the [and,AND] by [or,OR] .....

 

-- 
Ahmed Amine JERRAYA
IMAG-TIM3/INPG, 46 Avenue Felix Viallet, F-38031 GRENOBLE CEDEX - FRANCE
Tel: 76 47 98 55 Ext: 607
UUCP: ...!seismo!mcvax!inria!archi!titine!jerraya or: jerraya@archi

Beebe@SCIENCE (Nelson H.F. Beebe) (04/20/87)

X-Us-Mail: "Center for Scientific Computation, South Physics, University of Utah, Salt Lake City, UT 84112"

X-Telephone: (801) 581-5254


Regarding this subterfuge for fullword bit twiddling:
>> integer function AND(i1,i2)
>> integer k1, k2,k3
>> logical j1,j2,j3
>> equivalence (k1,j1), (k2,j2), (k3,j3)
>> 
>> k1=i1
>> k2=i2
>> j3=j1.and.j2
>> AND=k3
>> end		    
>> 

IT WON'T WORK ON MANY MACHINES.  

First, a compiler is free to implement FORTRAN LOGICAL  data
as any  object  of size  at  least  one bit.   I  have  seen
compilers that tested  the sign  bit, others  that test  the
right-most bit, others  that test either  the right-most  or
left-most   byte,   and   still   others   that   test   for
zero/non-zero.  The LOGICAL .OP. operators will rarely  work
on fullword data.

Second, there may be no guarantee  that a LOGICAL is of  the
same size as an INTEGER, and I could name one compiler where
they are not (apparently in  violation of ANSI F77,  Section
4.7, p. 4-4 "A logical datum has one numeric storage unit in
a storage sequence").

The code  above will  work on  some machines,  but  comments
should  definitely   flag  it   as  non-portable.    It   is
regrettable that  ANSI  never  included a  standard  set  of
integer bit operations  (.AND., .OR.,  .NOT., .XOR.),  since
almost all compilers (IBM notably excepted) have implemented
them in some fashion.
-------

spaf@gt-karloff.uucp (Gene Spafford) (04/26/87)

The following implements a bitwise logical AND operation in Fortran.
It is *NOT* portable, but the idea can be adapted fairly easily to
other representations.  The other functions (OR, XOR, NOT, etc)
can be implemented in a similar manner.

Assumptions for this version:
1) Integer representation is 2's complement, with sign bit in
most significant bit position.
2) Integer addition quietly ignores overflow
3) Parameter NUMBITS is set to number of bits in an integer.

Way it works: by doubling the number each time through the loop, you
are doing an effective shift left by one position.  If the sign bit
is set, the most significant bit is a one, and the number is negative.
By comparing bits, we know whether to introduce a 0 or 1 bit into
the result.  The result is shifted too, to bring the bits into
the right positions.


	integer function bitand (iarg1, iarg2)
	integer iarg1, iarg2
	integer loop, jarg1, jarg2, kret
	parameter (numbits = 32)

	kret = 0
	jarg1 = iarg1
	jarg2 = iarg2

	do 10 loop = 1, numbits
	   kret = kret + kret
	   if (jarg1 .lt. 0 .and. jarg2 .lt. 0) kret = kret + 1
	   jarg1 = jarg1 + jarg1
	   jarg2 = jarg2 + jarg2
   10	continue

	bitand = kret
	end

Gene Spafford
Software Engineering Research Center (SERC), Georgia Tech, Atlanta GA 30332
CSNet:	Spaf @ GATech		ARPA:	Spaf@Gatech.EDU
uucp:	...!{akgua,decvax,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf